BigInt减法

时间:2017-01-09 03:23:26

标签: java biginteger

我在尝试用Java中的carrys减去时遇到了问题。

public BigInt add(BigInt o) {
    int carry = 0;
    int max = n.length > o.n.length ? n.length : o.n.length;
    int[] result = new int[max+1];

    for (int i = 0; i <= max; ++i) {
        int top = i < n.length ? n[i] : 0;
        int bot = i < o.n.length ? o.n[i] : 0;

        result[i] = (top + bot + carry) % 10;
        carry = (top + bot + carry) / 10;
    }

    return new BigInt(trim(result));
}

public BigInt sub(BigInt o) {
    int carry = 0;
    int max = n.length > o.n.length ? n.length : o.n.length;
    int[] result = new int[max+1];

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

        int top = i < n.length ? n[i] : 0;
        int bot = i < o.n.length ? o.n[i] : 0;

        carry = (top + bot + carry) / 10;
        result[i] = (10 + top - bot - carry) % 10;
    }

    return new BigInt(trim(result));
}

我不知道自己做错了什么?我的加法课很完美,但减法给了我一个奇怪的答案。让我们说如果我减去5943-3952生病得到2091.当我们知道答案是1991年时。我的所有答案都只是前2位数字不正确。救命!!!!

1 个答案:

答案 0 :(得分:0)

您的代码存在很多问题,但首先会提供所需的结果:

public BigInt sub(BigInt o) 
{
    int carry = 0;
    int max = n.length > o.n.length ? n.length : o.n.length;
    int[] result = new int[max+1];

    for (int i = 0; i <= max; ++i) 
    {
        int top = i < n.length ? n[i] : 0;
        int bot = i < o.n.length ? o.n[i] : 0;

        int res = top - bot - carry;

        result[i] = (10 + res) % 10;
        carry = res < 0 ? 1 : 0;
    }

    return new BigInt(trim(result));
}   

但请注意,您不会考虑左操作数可能小于右操作的事实,因此您会得到否定结果。在将BigInt表示为&#34;数字&#34;数组时,似乎并不是表示负值的方法。如果有的话,我也不会看到它。

如果您也有负值,则有四种情况:

  • 正 - 正:总是从最高值减去最低值(总是38 - 17,从不17 - 38),相应地调整符号(例如17 - 38 =&gt; 38 - 17 = 21,现在调整符号,因为第一个是最小的:结果-21)。请注意,您需要一个函数来比较大小(即数组中的值而不管符号)。
  • 正 - 负:添加幅度(数组),符号为正(例如17 - ( - 38)= 17 + 38 = 55。
  • 否定 - 正面:添加量值,符号为负数。 (例如-17 - (+38)= -17-38 = - (17 + 38)= -55。
  • 否定 - 否定:作为第一种情况,相应地调整标志。