问题描述
- c语言题目二进制加法求指教
- 由键盘输入两个二进制正整数(均不超过2的31次方),计算输出它们的和(结果同样以二进制表示)。注:本题以字符串方式读取数据时,
务必使用scanf(""%s"" ....)的方式输入格式
共两行,一行一个二进制正整数(务必使用scanf(""%s"" ....)的方式,以确保读入的串末尾不会含有空格及其它特殊字符)
输出格式二进制形式的和
输入样例1101
10
输出样例1111
解决方案
1.首先不超过2的31次方,则只需要32位就够了,不需要那么大的数组。
2.xy是int数组,''就是0,怎么能作为x,y的结束
3.你不是一开始就算出来x,y的长度了吗,l1,l2,通过这个长度不就知道相加处理多少位了,
而且哪个长,最后再单独处理哪个不就行了。
或者在一开始,就把长的放在x中,短的放在y中,最后总是处理x。
解决方案二:
''的ascii是0,x数组和y数组是整型,如果输入001这种,那么x[i] != ''是false,两者的值是一致的。 把x[10000]={-1} y[10000]={-1}通过是否等于-1进行判断
解决方案三:
最简单可靠的办法就是转换成10进制相加再转回去。
解决方案四:
#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] != '' && y[i] != ''; 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] != '')//剩下另外一个没加完的数组继续加到sum中
{
for(; x[i] != ''; 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] != ''; 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;
}
帮忙看下哪里错了