兩個字符串表示兩個非常大的數,請設計算法計算這兩個大數的乘積,結果用字符串表示。例如S1=”7832974972840919321747983209327”,S2=”1987432091904327543957”,設計算法計算出S1*S2的結果,結果用String輸出,不准用BigInter。
思路:
根據手工計算兩數相乘的過程,用代碼實現這個過程。
代碼:
import java.util.Scanner;
public class DaZhengShuChengJi {
public static void main(String[] args) {
System.out.println(multiply(num1, num2));
}
public static String multiply(String num1, String num2) {
int l = num1.length();
int r = num2.length();
//用來存儲結果的數組,可以肯定的是兩數相乘的結果的長度,肯定不會大於兩個數各自長度的和。
int[] num = new int[l+r];
//第一個數按位循環
for(int i=0;i<l;i++) {
//得到最低位的數字
int n1=num1.charAt(l-1-i)-'0';
//保存進位
int tmp=0;
//第二個數按位循環
for(int j=0;j<r;j++) {
int n2=num2.charAt(r-1-j)-'0';
//拿出此時的結果數組里存的數+現在計算的結果數+上一個進位數
tmp=tmp+num[i+j]+n1*n2;
//得到此時結果位的值
num[i+j]=tmp%10;
//此時的進位
tmp/=10;
}
//第一輪結束后,如果有進位,將其放入到更高位
num[i+r]=tmp;
}
int i=l+r-1;
//計算最終結果值到底是幾位數,
while(i>0&&num[i]==0){
i--;
}
StringBuilder result="";
//將數組結果反過來放,符合正常讀的順序,
//數組保存的是:1 2 3 4 5
//但其表達的是54321,五萬四千三百二十一。
while(i>=0) {
result += num[i--];
}
return result;
}
}