我正在研究一个没有 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;
}