首页 > 试题广场 >

给定两个大于15位以上的大整数,请使用任意一种编程语言,实现

[问答题]

给定两个大于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);
    }
}

发表于 2020-02-19 11:03:56 回复(1)
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

发表于 2020-02-25 23:51:44 回复(0)