晚上好。 我正在努力完成我的作业而且陷入困境。 该程序的目的是在三元系统中添加两个数字。我不知道为什么,但我没有像我期望的那样工作。 我添加了2个号码。 45和27等于72,三元系统中的2200,程序给我20000。
#include <iostream>
#include <string>
#include <cmath>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
int a[4];
int b[4];
int carry=0;
int result[5];
a[0]=1;
a[1]=2;
a[2]=0;
a[3]=0;
b[0]=1;
b[1]=0;
b[2]=0;
b[3]=0;
for(int i=0; i<4; i++)
{
if(a[i]+b[i]+carry==6)
{
result[i]=2;
carry=0;
}
if(a[i]+b[i]+carry==5)
{
result[i]=1;
carry=2;
}
if(a[i]+b[i]+carry==4)
{
result[i]=1;
carry=1;
}
if(a[i]+b[i]+carry==3)
{
result[i]=1;
carry=0;
}
if(a[i]+b[i]+carry==2)
{
result[i]=0;
carry=2;
}
if(a[i]+b[i]+carry==1)
{
result[i]=0;
carry=1;
}
if(a[i]+b[i]+carry==0)
{
result[i]=0;
carry=0;
}
}
result[4]=carry;
for(int j=4; j>=0; j--)
{
cout<<result[j];
}
cout<<endl;
return 0;
}
答案 0 :(得分:2)
目前还没有安装c编译器,但是这样的事情应该有效。我要给你一个草图,而不是完整的东西。请注意我如何翻转a
和b
中的数字序列,这意味着i = 0
以最低有效数字开头,这就是您对carry
的所需数字。另外,请注意我如何将result
初始化为全零,这是一种安全措施。
int a[4];
int b[4];
int carry=0;
int result[5] = {0,0,0,0,0};
a[3]=1;
a[2]=2;
a[1]=0;
a[0]=0;
b[3]=1;
b[2]=0;
b[1]=0;
b[0]=0;
int sum = 0;
for (int i = 0; i <= 3; i++) {
sum = a[i] + b[i] + carry;
if (sum > 2) {
//do something with carry
//do something with sum
} else {
//make sure carry is 0
}
result[i] = sum;
}
//set result[4] to carry--but what if carry is > 2 (say if you were adding more than 2 numbers?)
//todo: make this general, so that it is not dependent on having arrays of width 4 for input and 5 for result.
答案 1 :(得分:2)
你有两件事情混乱。
首先,正如DWright已经注意到的那样,你混淆了你的数字,你实际上是在添加0021和0001。
其次,你混淆了数字和进位,例如如果总和为6,则进位应为2而不是该位置的数字。
虽然我同意您应该像DWright建议的那样重写您的程序,但这是您的代码版本,应该按照您的意愿执行,这可能有助于您理解错误。
#include <iostream>
#include <string>
using namespace std;
#include <iostream>
#include <string>
#include <cmath>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
int a[4];
int b[4];
int carry=0;
int result[5];
a[0]=0;
a[1]=0;
a[2]=2;
a[3]=1;
b[0]=0;
b[1]=0;
b[2]=0;
b[3]=1;
for(int i=0; i<4; i++)
{
if(a[i]+b[i]+carry==6)
{
result[i]=0;
carry=2;
}
else if(a[i]+b[i]+carry==5)
{
result[i]=2;
carry=1;
}
else if(a[i]+b[i]+carry==4)
{
result[i]=1;
carry=1;
}
else if(a[i]+b[i]+carry==3)
{
result[i]=0;
carry=1;
}
else if(a[i]+b[i]+carry==2)
{
result[i]=2;
carry=0;
}
else if(a[i]+b[i]+carry==1)
{
result[i]=1;
carry=0;
}
else if(a[i]+b[i]+carry==0)
{
result[i]=0;
carry=0;
}
}
result[4]=carry;
for(int j=4; j>=0; j--)
{
cout<<result[j];
}
cout<<endl;
return 0;
}
编辑:我也将分支更改为else。由于你改变了链中的进位,你有可能在一次运行之前进入几个分支,即使它们看起来是独占的,例如a[i]+b[i]+carry == 6
你将carry
设置为0(错误地,但有也是正确代码中的例子)a[i]+b[i]+carry == 4
(进位必须在2之前),所以函数也会进入该分支。