添加两个二进制数(整数数组)



我做了这个程序,将存储在整数数组中的两个相同长度的二进制数相加,并将总和存储在一个新的整数数组中。但由于某些逻辑错误,它不显示所需的输出。

#include <conio.h>
#include <iostream.h>
void main() {
clrscr();
int a[] = {1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1,
1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1};
int b[] = {1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1,
1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0};
int temp[100];
int carry = 0, p = 35;
for(int i = 34; i >= 0; i--) {
if(a[i] + b[i] + carry == 0) {
temp[p] = 0;
carry = 0;
p--;
}
if((a[i] + b[i] + carry) == 1) {
temp[p] = 1;
carry = 0;
p--;
}
if((a[i] + b[i] + carry) == 2) {
temp[p] = 0;
carry = 1;
p--;
}
if((a[i] + b[i] + carry) > 2) {
temp[p] = 1;
carry = 1;
p--;
}
}
for(int pop = 0; pop < 36; pop++) cout << temp[pop];
getch();
}

预期输出为:

110100101001100101101010110101011111

实际输出为:

101100110011011101011011101011011111
if((a[i] + b[i] + carry) == 2) {
temp[p] = 0;
carry = 1;
p--;
}
if((a[i] + b[i] + carry) > 2) {
temp[p] = 1;
carry = 1;
p--;
}

a[i] = 1, b[i] = 1, carry = 0完成此操作
这将触发这里的第一个if,然后将 carry 设置为 1。
然后第二个if将找到配置a[i] = 1, b[i] = 1, carry = 1,尽管原始配置不合适,但仍触发了它,从而导致错误。

对于将来,请了解如何使用调试器,或者至少如何在程序中包含一些调试控制台打印。设置停止点或打印相应图表中存在节点的位置,以查看流程是否采用正确的路线。
带印刷品:

for(int i = 34; i >= 0; i--) {
cout << "entered loop" << endl;
if(a[i] + b[i] + carry == 0) {
temp[p] = 0;
carry = 0;
p--;
cout << "recognized case 1" << endl;
}
if((a[i] + b[i] + carry) == 1) {
temp[p] = 1;
carry = 0;
p--;
cout << "recognized case 2" << endl;
}
if((a[i] + b[i] + carry) == 2) {
temp[p] = 0;
carry = 1;
p--;
cout << "recognized case 3" << endl;
}
if((a[i] + b[i] + carry) > 2) {
temp[p] = 1;
carry = 1;
p--;
cout << "recognized case 4" << endl;
}
}

(但使用调试器比打印更好。

代码中的问题是你有一组单独的if语句,每个语句都修改carry,如果carry以改变后续if语句的结果,那么将执行多个if语句主体。

简单的解决方法是将最后 3 个if更改为else if

您还需要将最终的进位添加到输出中:

temp[0] = carry;
for(int pop = 0; pop < 36; pop++) cout << temp[pop];

但是,使用 swtich 语句可以大大简化您的代码。更简单的代码通常错误较少,更容易理解:

for(int i = 34; i >= 0; i--, p--) {
switch(a[i] + b[i] + carry) {
case 0:
temp[p] = 0;
carry = 0;
break;
case 1:
temp[p] = 1;
carry = 0;
break;
case 2:
temp[p] = 0;
carry = 1;
break;
case 3:
temp[p] = 1;
carry = 1;
break;
default:
// should never be reached with inputs of 0 or 1
throw std::invalid_argument("invalid input");
}
}

可以使用位操作来删除所有分支并直接设置位,从而进一步简化此代码,但我会将其作为读者提示的练习。

最新更新