public LongNumber minus(LongNumber ln) { if (this.sign * ln.sign < 0) { // 異符号の場合 LongNumber lnTmp = getCloneOf(ln); lnTmp.inverseSign(); return this.plus(lnTmp); } else { // 同符号の場合 // 同じ符号の引き算でケタは増えない int newDigit = Integer.max(this.getDigit(), ln.getDigit()); LongNumber ret = getCloneOf(LongNumber.getAbsoluteMax(this, ln), newDigit); LongNumber small = getCloneOf(LongNumber.getAbsoluteMin(this, ln), newDigit); if (small.equals(ln)) { ret.sign = 1; } else { ret.sign = -1; } for (int i = 0; i < newDigit; i++) { if (ret.value[i] >= small.value[i]) { ret.value[i] -= small.value[i]; } else { ret.value[i + 1] -= 1; ret.value[i] = ret.value[i] + MAX_OF_EACH_DIGIT - small.value[i]; } } return ret.refresh(); } }
public LongNumber plus(LongNumber ln) { if (this.sign * ln.sign < 0) { // 異符号の場合 LongNumber lnNegative; LongNumber lnPositive; if (this.sign > 0) { lnNegative = getCloneOf(ln); lnPositive = getCloneOf(this); } else { lnNegative = getCloneOf(this); lnPositive = getCloneOf(ln); } lnNegative.sign = 1; return lnPositive.minus(lnNegative); } else { // 同符号の場合 // 和による繰り上がりは大きくて1桁 int newDigit = Integer.max(this.getDigit(), ln.getDigit()) + 1; LongNumber ret = emptyLongNumber(newDigit); ret.sign = this.sign; for (int i = 0; i < this.getDigit(); i++) ret.value[i] += this.value[i]; for (int i = 0; i < ln.getDigit(); i++) ret.value[i] += ln.value[i]; for (int i = 0; i < newDigit - 1; i++) { if (ret.value[i] >= MAX_OF_EACH_DIGIT) { ret.value[i] -= MAX_OF_EACH_DIGIT; ret.value[i + 1] += 1; } } return ret.refresh(); } }
public LongNumber multiple(LongNumber ln) { int digit = this.getDigit() + ln.getDigit(); LongNumber ret = emptyLongNumber(digit); ret.sign = this.sign * ln.sign; for (int i = 0; i < this.getDigit(); i++) { for (int j = 0; j < ln.getDigit(); j++) { ret.value[i + j] += this.value[i] * ln.value[j]; } } int carry; for (int i = 0; i < digit - 1; i++) { carry = (int) ((double) ret.value[i] / MAX_OF_EACH_DIGIT); ret.value[i] -= MAX_OF_EACH_DIGIT * carry; ret.value[i + 1] += carry; } return ret.refresh(); }