使用char数组将大数字加在一起

时间:2014-10-13 00:30:36

标签: c++

我有一个我应该做的任务 1.)读入2个字符数组 2.)将阵列加在一起,进行携带添加,携带数十个位置 3.)打印出新添加的数组。

如果我需要继续执行数组的最后一位数字(溢出),我也应该打印一个错误 所以像99999999999999999999 +                                      1 =                   ________________________                          ERROR

这是我遇到麻烦的部分。 上面的输出类似“99999999999999999:0”,所以我不知道出了什么问题。

我会发布我的代码,但请保持良好:(我知道它肯定不是最有效的,但我只是想以一种容易让我的大脑现在理解的方式来解决问题。 是的,我来使用char数组。我想这是为了帮助我们理解ascii表。

#include <iostream>

using namespace std;

void InitNumber(char[]);
int AddArrays(char first[],  char second[], char combined[]);
void OutputNumber (char[]);

const int LENGTH = 20; // global variable

int main()
{

char set1[LENGTH];
char set2[LENGTH];
char sum[LENGTH];
InitNumber (set1);
InitNumber (set2);
if(AddArrays (set1, set2, sum)) {
    cout << "overflow!" << endl;

}

OutputNumber(sum);
}


void InitNumber (char list[])
{
int numberOfDigits;
cout << "Please enter the number of digits in the number: ";
cin >> numberOfDigits;
cout << "Please enter the digits in the number with the LEAST significant first: ";
for (int i = 0; i < numberOfDigits; i++) {
    cin >> list [i]; 
}
for (int l=(numberOfDigits); l < LENGTH; l++) {
    list [l] = '0'; 
}
}
int AddArrays(char first[],  char second[], char combined[])
{
for (int h = 0; h < LENGTH; h++)
    combined[h]= '0';

int overflow = 0;


for (int i = 0; i < LENGTH; i++) {

    int currentSum = (first[i]-'0' + second[i]-'0');
    cout << "currentSum = " << currentSum << endl;
    if(currentSum / 10 == 0 )
        combined[i] += currentSum;
    else if (currentSum/10 !=0) {
        if (i == LENGTH-1 && currentSum/10 !=0){
            overflow = 1;

        }
        else{
        combined [i]  += currentSum%10;
        cout << "current i: " << combined[i] << endl;

        combined [i+1] += currentSum/10;
        cout << "current i+1: " << combined[i+1] << endl;
        }
        }


    }

return overflow;
}



void OutputNumber(char arrayOut[])
{
for (int l=LENGTH - 1; l >= 0; l--)
        cout << arrayOut[l];
}

工作输入输入 6 1 2 3 4 5 6 7 1 2 3 4 5 6 7

输出 00000000000008308642

不工作的输出

输入 20 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 1 1

输出 999999999999999999:0

1 个答案:

答案 0 :(得分:2)

为了解释为什么你的溢出检测被破坏,我将重现你内部循环的小部分。

for (int i = 0; i < LENGTH; i++) {
    int currentSum = (first[i]-'0' + second[i]-'0');
    if(currentSum / 10 == 0 )
        combined[i] += currentSum;

在这里,您要添加您正在添加的两个数字中的相应数字对,并检查(按您的特定风格)它们是否溢出。试着记住这一部分,这很重要。为了检查是否有溢出,您只需检查从您添加的两个大数字中添加数字对的结果。

    else if (currentSum/10 !=0) {

这是一项完全没用的检查。如果已知除法产生非零结果,则只能到达此处。这个if()可以完全删除。现在,代码的相关部分是

    combined [i]  += currentSum%10;
    combined [i+1] += currentSum/10;

你看到了问题吗?

一旦检测到溢出,您的方法是增加结果中的下一个更高位数字。

不幸的是,在下一次循环迭代中,为了检查结转,您只需从您添加的两个大数字中检查下一个相应数字对的总和。你在这里保存的结转将被完全忽略。

假设您的号码最长为两位数,而不是20位,并输入数字99和1.

  • 在第一次迭代中,您将添加9和1,将0保存为第一个数字,并将1加到第二个数字中。

  • 在第二次迭代中,您将添加9和0,并且,根据您的逻辑,可以得出结论,没有任何溢出。