1

我正在研究一个没有 BigInteger 类的大整数计算器。当我将一个正数和一个负数相除时,即使我将 EXACT 相同的 else 语句与乘法方法(有效)一起使用,它也不会返回负数。

我通过调试器运行它,似乎无法弄清楚为什么它没有按照我的意愿去做。这是我的代码的一部分(divide 方法中的 else 语句是在除以正数和负数后应该返回负数):

谢谢

public BigInt multiply(BigInt B2) {
    BigInt result = new BigInt();
    BigInt zero = new BigInt("0");
    BigInt b;

    for (int i = 0; i < B2.str.length(); ++i) {
        b = singleDigitMultiply(
                B2.str.charAt(B2.str.length() - i - 1), i);
        result = result.add(b);
    }

    // anything * 0 is 0
    if (this.add(zero).toString().equals("0") || B2.add(zero).toString().equals("0") ||
            this.add(zero).toString().equals("-0") || B2.add(zero).toString().equals("-0"))
        {
            result.num.clear();
            result.num.add(0);
        }
    else if ((!this.isPositive && B2.isPositive) ||
            (this.isPositive && !B2.isPositive))
    {
        //if not 0, assign negative when -a * b or a * -b
        result.isPositive = false;
    }

    return result;
}

private BigInt singleDigitMultiply(char b, int baseFactor) {
    StringBuffer tmp = new StringBuffer("");

    int carry = 0;
    for (int i = 0; i < str.length(); ++i) 
    {

        if (str.charAt(str.length() - i - 1) != '-' && str.charAt(str.length() - i - 1)
            != '+' && b != '-' && b != '+')
        {
            int d = str.charAt(str.length() - i - 1) - '0';
            int r = d * (b - '0') + carry;
            carry = r / 10;
            int digit = r % 10;
            tmp.append(digit);
        }
    }

    if (carry != 0)
        tmp.append(carry);

    String result = tmp.reverse().toString();
    // add enough zeros to the result
    for (int i = 0; i < baseFactor; ++i) {
        result += '0';
    }


    return new BigInt(result);
}

public BigInt divide(BigInt B2)
{
    BigInt result;
    BigInt divisor = B2;
    BigInt dividend = this;

    divisor.isPositive = true;
    dividend.isPositive = true;


    if (divisor.toString().equals("0") ||
        divisor.toString().equals("+0") ||
        divisor.toString().equals("-0"))
    {
        System.out.println("CANNOT DIVIDE BY 0");
        //cannot divide by 0
        result = new BigInt("NaN"); 
    }
    else if (divisor.equals(dividend))
    {
        //anything divided by self is 1
        result = new BigInt("1");
    }
    else if (dividend.equals("0"))
    {
        //0 divided by anything is 0
        result = new BigInt("0");
    }
    else
    {
        result = divideHelper(dividend, divisor);
        if ((!this.isPositive && divisor.isPositive) ||
        (this.isPositive && !divisor.isPositive))
        {
            //if not 0, assign negative when -a * b or a * -b
            result.isPositive = false;
        }
    }


    return result;

}

private BigInt divideHelper(BigInt dividend, BigInt divisor)
{
    int size1 = dividend.num.size(), size2 = divisor.num.size();
    BigInt result = new BigInt();

    int first = size1 - 1, 
        second = size2 - 1,
        three;

    if (size1 == 1 && size2 == 1) {
        three = dividend.num.get(first) / divisor.num.get(second);
        result.num.add(0, three);
    }




    return result;
}
4

1 回答 1

0

divideHelper()似乎无法正确处理大多数除法情况。size1 == 1 && size2 == 1它仅在和所有其他情况(大多数除法)似乎返回未初始化的值时才实际执行任何操作。

对我来说,它看起来不像是工作划分或长划分算法。

此外,“快捷方式比较”中的 BigInt 与字符串divide()至少进行了一次equals()比较——这是行不通的。您需要直接比较BigInt.valueBigInt.toString()反对字符串,而不是 BigInt。

可能您可以(即应该)免除divide()除零以外的特殊情况。集中精力使实际的除法算法工作,不要试图绕过它应该能够回答的情况。

于 2013-10-17T04:33:03.590 回答