1

BigInteger クラスを使用しない大きな整数計算機に取り組んでいます。正の数と負の数を除算すると、乗算メソッド(機能する)でEXACTと同じelseステートメントを使用しているにもかかわらず、負の数は返されません。

デバッガーで実行しましたが、意図したとおりに動作しない理由がわかりません。これが私のコードの一部です(除算メソッドの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