大きな整数の乗算は実際には非常に簡単です(Java)
目的と紹介
- Java言語を使用して大きな整数の乗算を実現する
- 大きな整数が乗算される限り、大きな整数の加算、減算、および除算は非常に簡単です
- 大きな整数を追加します。キャリー演算にはループのみが必要です
- 大きな整数を減算し、ループで借りるだけでよいので、符号に注意してください。
- 大きな整数の除算は、単に大きな整数を複数回減算することです。
デザインのアイデア
- 数学的な乗算をシミュレートし、ビットを乗算し、最後に追加します
- 追加するとき、下位ビットが10を超える場合、前進します
具体的な手順
- 演算子が最初に判断され、最終結果は正または負です。
- 手動操作を転送できますが、コンピュータは文字列の反転を実行します。これは計算と保存に便利です。
- 計算の結果については、それを格納する場所を見つける必要があります。新しい配列のサイズは、2つの数値の積の桁数であり、2桁の合計を超えません。
- 計算と数値処理を実行(キャリー)
- 余分な0を削除して、サインを忘れずに
コード
public class BigIntegersMulti {
public String multi(String args, String args2) {
StringBuffer sb = new StringBuffer(args);
StringBuffer sb2 = new StringBuffer(args2);
int signal = 0;
if ("-".equals(args.substring(0, 1))) {
sb.delete(0, 1);
signal++;
}
if ("-".equals(args2.substring(0, 1))) {
sb2.delete(0, 1);
signal++;
}
char[] ch = sb.reverse().toString().toCharArray();
char[] ch2 = sb2.reverse().toString().toCharArray();
int length = ch.length + ch2.length;
int[] sum = new int[length];
for (int i = 0; i < ch.length; i++) {
for (int j = 0; j < ch2.length; j++) {
sum[i + j] += (ch[i] - '0') * (ch2[j] - '0');
}
}
for (int i = 0; i < length - 1; i++) {
sum[i + 1] += (sum[i] / 10);
sum[i] %= 10;
}
StringBuffer sb3 = new StringBuffer();
int u = length - 1;
while (sum[u] == 0) {
u--;
}
for (; u >= 0; u--) {
sb3.append(sum[u]);
}
if ((signal & 1) == 1) {
sb3.insert(0, "-");
}
return sb3.toString();
}
}
テストケース設計
- 負の数を掛けた負の数をテストする
- 正の数に負の数を掛けてテストする
- 99 999999の倍数は、9999の倍数を与える9数学的な関係、認証の数を乗算するため(nで構成される2つの同一9、結果はn-1 9 8 + 1 + n-1) 0プラス1)
public void testmulti() {
String s1 = "-12345679", s2 = "-12345679";
String s3 = bigIntegersMulti.multi(s1, s2);
assert s3.equals("152415789971041");
s1 = "12345679";
s2 = "-12345679";
s3 = bigIntegersMulti.multi(s1, s2);
assert s3.equals("-152415789971041");
StringBuffer sb = new StringBuffer();
StringBuffer sb1 = new StringBuffer();
sb.append(9);
for (int i = 1; i < 20; i++) {
sb.append(9);
s3 = bigIntegersMulti.multi(sb.toString(), sb.toString());
for (int j = 0; j < i; j++) {
sb1.append(9);
}
sb1.append(8);
for (int j = 0; j < i; j++) {
sb1.append(0);
}
sb1.append(1);
assert s3.equals(sb1.toString());
sb1 = new StringBuffer();
}
}
ピット詳細