Exemplo n.º 1
0
  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();
    }
  }
Exemplo n.º 2
0
  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();
    }
  }
Exemplo n.º 3
0
 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();
 }