Description
给出a和b两个01串,模拟二进制加法过程输出a+b
Input
第一行为一整数T表示用例组数,每组用例占一行包括两个01串
Output
对于每组用例,输出两个01串相加的结果(最简形式)
Sample Input
3
1001101 10010
1001001 11001
1000111 1010110
Sample Output
1 1011111
2 1100010
3 10011101
Solution
高精度加法,注意前置0
Code
#include<stdio.h>
#include<string.h>
void solve(char *a,char *b,char *c)
{
int l1=strlen(a),l2=strlen(b),x[111],y[111],z[111];
int l=l1>l2?l1:l2;
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
memset(z,0,sizeof(z));
for(int i=l1-1;i>=0;i--)
x[l1-1-i]=a[i]-'0';
for(int i=l2-1;i>=0;i--)
y[l2-1-i]=b[i]-'0';
int k=0;
for(int i=0;i<l;i++)
{
z[i]=(x[i]+y[i]+k)%2;
k=(x[i]+y[i]+k)/2;
}
z[l++]=k;
while(l>=0&&z[l-1]==0)l--;//去前置0
if(l==0)//a+b=0时特判
{
c[0]='0';
c[1]='\0';
return ;
}
for(int i=0;i<l;i++)
c[i]=z[l-1-i]+'0';
c[l]='\0';
}
int main()
{
char s1[111],s2[111],ans[111];
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s%s",s1,s2);
solve(s1,s2,ans);
printf("%d %s\n",i,ans);
}
return 0;
}