加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

LeetCode-Problem 43:大数相乘

发布时间:2020-12-14 04:51:16 所属栏目:大数据 来源:网络整理
导读:算法问题 给定两个以字符串表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积。 算法实现 以下是大神的算法,膜拜大神 : 首先,长度位m的数乘以长度为n的数的结果不超过m+n。 接下来,我们来看下两数相乘的计算过程,从右向左,将数2中的每一位的数与

算法问题

给定两个以字符串表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积。

算法实现

以下是大神的算法,膜拜大神

首先,长度位m的数乘以长度为n的数的结果不超过m+n。

接下来,我们来看下两数相乘的计算过程,从右向左,将数2中的每一位的数与数1相乘,最后将结果相加。下图演示的是两数相乘的整个过程,从下图中,我们可以得到,对于num[i] *num[j](数1中的第i位数字与数2中的第j位数字相乘的结果只会存放在第【i+j】和【i+j+1】这两位上)

这里写图片描述

因此,我们实现算法如下:

public static String multiply(String num1,String num2) {
        int m = num1.length(),n = num2.length();
        int[] pos = new int[m + n];

        for (int i = m - 1; i >= 0; i--) {
            for (int j = n - 1; j >= 0; j--) {
                int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
                int p1 = i + j,p2 = i + j + 1;
                int sum = mul + pos[p2];

                pos[p1] += sum / 10;
                pos[p2] = (sum) % 10;
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int p : pos) {
            if (!(sb.length() == 0 && p == 0)) {
                sb.append(p);
            }
        }
        return sb.length() == 0 ? "0" : sb.toString();
    }

另外,常见的大数相乘算法还有:

  • Karatsuba算法
  • FFT快速傅里叶变换算法

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读