poj 1832 连环锁

还是格雷码+高精度。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;
}
		



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值