• 締切済み

任意精度の整数を表わすクラスの定義

任意精度の整数を表わすクラスを定義したいのですがよくわからないので教えて下さい。 (JAVAにはBiglntegerというクラスがあるようですがそれとは別に) 参考として、非任意精度の非負整数(0以上の整数)を表わすクラス(LongUnsignedとして)の定義をここに載せておきたいのですが、ここには800文字以上入らないようなので、補足の方に書いておきます。 本当にまだ未熟なので、わかる方がいらっしゃいましたらどうかお願いします。

みんなの回答

回答No.1

補足をお願いします

Tamagawa
質問者

補足

非任意精度の非負整数を表わすクラスは // LongUnsigned -- 任意精度の非負整数 class LongUnsigned { private byte[] mDigits; // 整数値 public LongUnsigned(int n) { String numString = Integer.toString(Math.abs(n)); // Math.abs() は,絶対値を計算する静的メソッド int numLength = numString.length(); mDigits = new byte[numLength]; for (int i = 0; i < numLength; ++i) { mDigits[numLength - i -1] = (byte)(numString.charAt(i) - '0'); } } public LongUnsigned(byte[] digits) { mDigits = digits; } // 等値性の比較 public boolean equals(LongUnsigned n) { if (mDigits.length != n.mDigits.length) { return false; } for (int i = mDigits.length - 1; i >= 0; --i) { if (mDigits[i] != n.mDigits[i]) { return false; } } return true; } // 順序の比較 public boolean le(LongUnsigned n) { // a.le(b) は a <= b の意味 if (mDigits.length > n.mDigits.length) { return false; } else if (mDigits.length < n.mDigits.length) { return true; } for (int i = mDigits.length - 1; i >= 0; --i) { if (mDigits[i] > n.mDigits[i]) { return false; } else if(mDigits[i] < n.mDigits[i]) { return true; } } return true; } // 加算 public LongUnsigned add(LongUnsigned n) { byte[] a, b; if (mDigits.length >= n.mDigits.length) { a = mDigits; b = n.mDigits; } else { a = n.mDigits; b = mDigits; } byte[] ans = new byte[a.length]; byte carry = 0; for (int i = 0; i < a.length; ++i) { byte sum = (byte)(a[i] + carry); if (i < b.length) { sum = (byte)(sum + b[i]); } ans[i] = (byte)(sum % 10); carry = (byte)(sum / 10); } if (carry == 0) { return new LongUnsigned(ans); } else { byte[] ans2 = new byte[ans.length + 1]; for (int i = 0; i < ans.length; ++i) { ans2[i] = ans[i]; } ans2[ans.length] = 1; return new LongUnsigned(ans2); } } // 乗算 public LongUnsigned mul(LongUnsigned n) { LongUnsigned ans = new LongUnsigned(0); LongUnsigned i = new LongUnsigned(1); LongUnsigned one = new LongUnsigned(1); while (i.le(n)) { ans = ans.add(this); i = i.add(one); } return ans; } public LongUnsigned factorial() { LongUnsigned ans = new LongUnsigned(1); LongUnsigned i = new LongUnsigned(1); LongUnsigned one = new LongUnsigned(1); while (i.le(this)) { ans = ans.mul(i); i = i.add(one); } return ans; } //文字列への変換 public String toString() { String s = ""; for (int i = mDigits.length - 1; i >= 0; --i) { s = s + mDigits[i]; } return s; } } こうなります。

関連するQ&A