给定两个大于15位以上的大整数,请使用任意一种编程语言,实现两个大整数的乘法运算(不得使用语言或框架内置提供的大数乘法API)。
/**
* 解题思路:
* 数字太大,所以用字符串来表示,先都翻转一下,这样更好计算,然后通过第一个字符串中的每一位来乘
* 第二个字符串的每一位,第一个字符串的第i位(从0开始)是i+1位数,第二个字符串的第
* j位是(j+1)位数,相乘应该是i+j+1位数或是i+j+2位数,可以当成是i+j+1位数(可以以后再进位),这样
* 计算的时候把计算的数值就可以都加到arr数组的第i+j的位置中。最后再来一个进位计算和数字反转就可以了。
*/
public class BigDecimal {
public String calculate(String a,String b){
StringBuilder aa=new StringBuilder(a);
StringBuilder bb=new StringBuilder(b);
aa.reverse();
bb.reverse();
int m=aa.length();
int n=bb.length();
int[] arr=new int[m+n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
arr[i+j]=(aa.charAt(i)-'0')*(bb.charAt(j)-'0');
}
}
for(int i=0;i<arr.length-1;i++){
//进位
arr[i+1]+=arr[i]/10;
arr[i]%=10;
}
StringBuilder result=new StringBuilder();
for(int i=0;i<arr.length-1;i++){
result.append(arr[i]);
}
return result.reverse().toString();
}
public static void main(String[]args){
BigDecimal bigDecimal=new BigDecimal();
String result=bigDecimal.calculate("123456789012345","1234567879012345");
System.out.println(result);
}
}
function multipy(a, b) {
let num1 = a.toString().split('');
let num2 = b.toString().split('');
let len1 = num1.length;
let len2 = num2.length;
let ans = [];
for (let i = len1 - 1; i >= 0; i--) {
for (let j = len2 - 1; j >= 0; j--) {
let index1 = i + j;
let index2 = i + j + 1;
let mul = num1[i] * num2[j] + (ans[index2] || 0);
ans[index1] = Math.floor(mul / 10) + (ans[index1] || 0);
ans[index2] = mul % 10;
}
}
let result = ans.join('');
console.log('结果:' + result === 0 ? '0' : result.replace(/^0+/, ''));
}
multipy(12, 16); // 192