我有一个我应该做的任务 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
答案 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,并且,根据您的逻辑,可以得出结论,没有任何溢出。