与大数减法不一致

时间:2017-06-04 15:34:37

标签: c++ largenumber integer-arithmetic

我对C ++比较陌生,我正在尝试创建一组能够处理大数的算术函数,使用一个名为biggie的结构来处理像字符串这样的数字。我目前在减法功能方面遇到了困难。

当我试着用小数字减去时,它的效果非常好。当我尝试向上扩展时,它在我第一次调用该函数时工作正常。

我第二次用大数字调用它,在另一个稍后会找到两个大数字的GCD的函数中,答案随着运行时间的不同而略有变化。有时,它与第一个输出完全相同。其他时候,只有3位数就错了,剩下的就好了。

这是我的减法函数代码:

biggie subtract (biggie a, biggie subtractor) {
    biggie difference;
    string aCopy = a.value;

    int digitDifference = 0;

    for (int i = aCopy.length(); i >= 0; i--) {
        digitDifference = strToInt(aCopy[i]) - strToInt (subtractor.value[i]);

        if (digitDifference < 0) {
            aCopy[i - 1] -= 1;
            digitDifference += 10;
        }

        difference.value += intToStr(digitDifference);
    }

    return difference;
}

这是我int main()中的代码:

biggie a;
a.value = "29345983548974568765879456985698642934598354897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852598678954398652934598329345983548974568765879456985679864986789543986579865489756897345980650953489754687453987456984569085254897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852798654897568973459806509534975468745398745698456908522934598354897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852";

biggie b;
b.value = "293459835489745687658794569856986429345983548974568765879456911111153489754687453987456984569085254897456876222225698567986459867895439865798654897568973459806509534897546874539874569845690852798651111168973459806509534975468745398745698456908522934598354897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852";

cout << "a: " << a.value << endl;
cout << "b: " << b.value << endl;
cout << "diff: " << (subtract(a, b)).value << endl;

biggie gcf = gcd(a, b);

这是我的gcd功能:

biggie gcd (biggie a, biggie b) {
    cout << endl;
    cout << "a: " << a.value << endl;
    cout << "b: " << b.value << endl;
    cout << "diff: " << (subtract(a, b)).value;
    return (subtract(a, b));
}

这是我得到的输出,当我运行程序时(一切都很完美除了数字162到164,这是不同的)。

a: 29345983548974568765879456985698642934598354897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852598678954398652934598329345983548974568765879456985679864986789543986579865489756897345980650953489754687453987456984569085254897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852798654897568973459806509534975468745398745698456908522934598354897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852
b: 293459835489745687658794569856986429345983548974568765879456911111153489754687453987456984569085254897456876222225698567986459867895439865798654897568973459806509534897546874539874569845690852798651111168973459806509534975468745398745698456908522934598354897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852
diff: 191013225540743444660078221856942595327491518824156154841295494507920769420781195934078007415265514746382795296725955236558257111156901806817869021100000300281988654648450355571495534474845762360522388515575714067347551318851969118525074113760326683276593397094179939610669980991987011160199799330883848833298072487612158549561427422487741178249739429387671688555714646431881066874165038582214771077947621912806007974406604465925076449662429801117865470000000000000000000000000000000000000000000000000000000000000

a: 29345983548974568765879456985698642934598354897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852598678954398652934598329345983548974568765879456985679864986789543986579865489756897345980650953489754687453987456984569085254897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852798654897568973459806509534975468745398745698456908522934598354897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852
b: 293459835489745687658794569856986429345983548974568765879456911111153489754687453987456984569085254897456876222225698567986459867895439865798654897568973459806509534897546874539874569845690852798651111168973459806509534975468745398745698456908522934598354897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852
diff: 191013225540743444660078221856942595327491518824156154841295494507920769420781195934078007415265514746382795296725955236558257111156901806817869021100000300281985724648450355571495534474845762360522388515575714067347551318851969118525074113760326683276593397094179939610669980991987011160199799330883848833298072487612158549561427422487741178249739429387671688555714646431881066874165038582214771077947621912806007974406604465925076449662429801117865470000000000000000000000000000000000000000000000000000000000000
Process returned 0 (0x0)   execution time : 0.085 s
Press ENTER to continue.

我也在使用OSX Yosemite并在CodeBlocks上运行该程序,如果这改变了什么。

编辑:为了澄清,biggie是一个处理大数字的结构。 biggie.value将是一个包含大量数字的字符串。 strToInt()intToStr()是完全按照名称暗示使用<sstream>库的函数。希望这会有所帮助。

1 个答案:

答案 0 :(得分:2)

由于这是一个学校项目,我将提供一些线索,没有直接答案。

您没有为operator[]显示biggie。这可能是一个问题;考虑a超过subtractor时会发生什么。

试试这个测试用例:284 - 86。

从左到右是进行减法的最佳方式吗?

相关问题