添加两个二进制数(整数数组)
adding two binary numbers(integer array)
我完成了这个程序,将存储在一个整数数组中的两个相同长度的二进制数相加,并将总和存储在一个新的整数数组中。但是由于一些逻辑错误,它没有显示所需的输出。
#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
,然后将进位设置为 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");
}
}
此代码可以进一步简化,使用位操作删除所有分支并直接设置位,但我将把它留作 reader hint.[=20= 的练习。 ]
我完成了这个程序,将存储在一个整数数组中的两个相同长度的二进制数相加,并将总和存储在一个新的整数数组中。但是由于一些逻辑错误,它没有显示所需的输出。
#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
,然后将进位设置为 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");
}
}
此代码可以进一步简化,使用位操作删除所有分支并直接设置位,但我将把它留作 reader hint.[=20= 的练习。 ]