c语言题目二进制加法求指教

由键盘输入两个二进制正整数(均不超过2的31次方),计算输出它们的和(结果同样以二进制表示)。注:本题以字符串方式读取数据时,
务必使用scanf("%s", ....)的方式

输入格式

共两行,一行一个二进制正整数(务必使用scanf("%s", ....)的方式,以确保读入的串末尾不会含有空格及其它特殊字符)
输出格式

二进制形式的和
输入样例

1101
10
输出样例

1111

c

4个回答

1.首先不超过2的31次方,则只需要32位就够了,不需要那么大的数组。
2.x,y是int数组,'\0'就是0,怎么能作为x,y的结束
3.你不是一开始就算出来x,y的长度了吗,l1,l2,通过这个长度不就知道相加处理多少位了,
而且哪个长,最后再单独处理哪个不就行了。
或者在一开始,就把长的放在x中,短的放在y中,最后总是处理x。

henuyx
Heart09 回复Freak_Van: 不客气,共同学习。
5 年多之前 回复
Freak_Van
Freak_Van 嗯 改了之后可以了,谢啦~
5 年多之前 回复

#include
#include
int main()
{
char a[10000], b[10000];//输入两个字符串
int x[10000], l1, y[10000], l2, i, j, sum[10000] = {0};
scanf("%s%s", &a, &b);
l1 = strlen(a);
l2 = strlen(b);
for(j = 0, i = l1-1; i >= 0; i--, j++)
x[j] = a[i] - '0';//逆序存放,将char型变成整型
for(j = 0, i = l2-1; i >= 0; i--, j++)
y[j] = b[i] - '0';//逆序存放,将char型变成整型
for(i = 0; x[i] != '\0' && y[i] != '\0'; i++)//相加到其中一个数组完为止
{

if(sum[i] + x[i] + y[i] >= 2)//相加后判断是否要进位,存放在sum数组中
{
sum[i] = (sum[i] + x[i] + y[i]) % 2;
sum[i+1] = 1;
}
else
{
sum[i] = sum[i] + x[i] + y[i];
sum[i+1] = 0;
}
}
if(x[i] != '\0')//剩下另外一个没加完的数组继续加到sum中
{
for(; x[i] != '\0'; i++)
{
if(sum[i] + x[i] == 2)
{
sum[i] = 0;
sum[i+1] = 1;
}
else
{
sum[i] = sum[i] + x[i];
sum[i+1] = 0;
}
}
}
else
{
for(; y[i] != '\0'; i++)
{
if(sum[i] + y[i] == 2)
{
sum[i] = 0;
sum[i+1] = 1;
}
else
{
sum[i] = sum[i] + y[i];
sum[i+1] = 0;
}
}
}
if(!sum[i])//sum[i]是0的话i-1;
i--;
for(; i >= 0; i--)
printf("%d", sum[i]);//逆序输出sum
return 0;
}
帮忙看下哪里错了

 '\0'的ascii是0,x数组和y数组是整型,如果输入001这种,那么x[i] != '\0'是false,两者的值是一致的。
 把x[10000]={-1} y[10000]={-1},通过是否等于-1进行判断
Freak_Van
Freak_Van 谢啦~
5 年多之前 回复

最简单可靠的办法就是转换成10进制相加再转回去。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐