布尔值不变

时间:2013-10-17 03:50:44

标签: java if-statement boolean

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

我通过调试器运行它,似乎无法弄清楚为什么它没有按我想要的那样做。这是我的代码的一部分(除法中的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;
}

1 个答案:

答案 0 :(得分:0)

divideHelper()似乎无法正确处理大多数分裂案例。它实际上只在size1 == 1 && size2 == 1时执行任何操作,并且对于所有其他情况(大多数分区)似乎返回未初始化的值。

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

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

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