在C ++中添加三进制数

时间:2015-03-22 19:51:19

标签: c++ c++11

晚上好。 我正在努力完成我的作业而且陷入困境。 该程序的目的是在三元系统中添加两个数字。我不知道为什么,但我没有像我期望的那样工作。 我添加了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;
}

2 个答案:

答案 0 :(得分:2)

目前还没有安装c编译器,但是这样的事情应该有效。我要给你一个草图,而不是完整的东西。请注意我如何翻转ab中的数字序列,这意味着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之前),所以函数也会进入该分支。