poj 1832 连环锁

来源:互联网 发布:windows xp pe 最小 编辑:程序博客网 时间:2024/04/28 23:01

还是格雷码+高精度。1A。大笑

#include<iostream>#include<string>using namespace std;int f[128][50];int start[128];int finish[128];int ko1[100];int ko2[100];int ans[100];int main(){int test,i,j,length,sum;memset(f,0,sizeof(f));f[0][0]=1;for(i=1;i<128;i++){for(j=0;j<50;j++)f[i][j]=f[i-1][j]*2;for(j=0;j<50;j++){f[i][j+1]=f[i][j+1]+f[i][j]/10;f[i][j]=f[i][j]%10;}}cin>>test;while(test--){cin>>length;sum=0;for(i=length-1;i>=0;i--){cin>>start[i];sum=sum+start[i];}for(i=0;i<length;i++){sum=sum-start[i];if(sum%2==1)start[i]=1-start[i];}sum=0;for(i=length-1;i>=0;i--){cin>>finish[i];sum=sum+finish[i];}for(i=0;i<length;i++){sum=sum-finish[i];if(sum%2==1)finish[i]=1-finish[i];}memset(ko1,0,sizeof(ko1));memset(ko2,0,sizeof(ko2));for(i=0;i<length;i++){if(start[i]==0)continue;int carry=0;for(j=0;j<50;j++){ko1[j]=ko1[j]+f[i][j]+carry;carry=ko1[j]/10;ko1[j]=ko1[j]%10;}}for(i=0;i<length;i++){if(finish[i]==0)continue;int carry=0;for(j=0;j<50;j++){ko2[j]=ko2[j]+f[i][j]+carry;carry=ko2[j]/10;ko2[j]=ko2[j]%10;}}int flag=0;for(i=49;i>=0;i--){if(ko1[i]-ko2[i]>0)flag=1;if(ko1[i]-ko2[i]<0)flag=2;if(flag!=0)break;}if(flag==0)cout<<0<<endl;else if(flag==1){int length1;for(i=0;i<50;i++)ans[i]=ko1[i]-ko2[i];for(i=0;i<50;i++)if(ans[i]<0){ans[i]=ans[i]+10;ans[i+1]=ans[i+1]-1;}for(i=49;i>=0;i--)if(ans[i]>0){length1=i;break;}for(i=length1;i>=0;i--)cout<<ans[i];cout<<endl;}else {int length2;for(i=0;i<50;i++)ans[i]=ko2[i]-ko1[i];for(i=0;i<50;i++)if(ans[i]<0){ans[i]=ans[i]+10;ans[i+1]=ans[i+1]-1;}for(i=49;i>=0;i--)if(ans[i]>0){length2=i;break;}            for(i=length2;i>=0;i--)cout<<ans[i];cout<<endl;}}return 0;}


原创粉丝点击