1
BigInteger 클래스가없는 큰 정수 계산기에서 작업하고 있습니다. 양수와 음수를 나눌 때, 곱셈법 (작동)과 정확히 같은 else 문을 사용하더라도 음수는 반환하지 않습니다. 부울 값이 변경되지 않습니다.
내가 디버거를 통해 실행하고 I가 원하는 일을하지 않는 이유를 알아낼 수 없습니다.감사
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;
}
내가 제대로 상황을 이해한다면, 당신은 오버 플로우에 대해 읽고 싶을 것이다. –
나는 그것에 익숙하지 않다. 그것은 내 문제와 어떤 관련이 있습니까? –