Loading

Leetcode-43-大数相乘

题目链接


题目描述

如标题

思路

  1. 首先要写一个大数加法,从右往左,按位相加,记录进位值。

  2. 从右向做,用一个乘数的每一位去乘另一个乘数,相乘的积累加
    注意: 相乘的 要依次增加一个0.
    即:123 × 456 = (100+20+3) × 456
    时间复杂度:O(mn+n^2)

  3. 有个O(clogc)的算法,c>=m+n的2的整数幂,叫快速傅里叶变化,不会.....


C++代码

class Solution {
public:

    string multiply(string num1, string num2) {
        if (num1 == "0" || num2 == "0") return "0";
        int n1 = num1.length();
        int n2 = num2.length();
        string ans="", ans1="";
        int x, y, c=0, t, cnt=0;
        for (int i = n1-1; i >= 0; i--) {
            x = num1[i] - '0';
            for (int j = n2-1; j >= 0; j--) {
                y = num2[j] - '0';
                t = (x*y+c) % 10;
                c = (x*y+c) / 10;
                ans1.push_back(t + '0');
            }

            if (c) {
                ans1.push_back(c + '0');
                c = 0;
            }
            reverse(ans1.begin(), ans1.end());
            for (int k = 0; k < cnt; k++)
                ans1.push_back('0');
            cnt++;
            ans = addStrings(ans, ans1);
            ans1 = "";
        }
        return ans;
    }

    string addStrings(string num1, string num2) {
        string ans;
        int len1 = num1.size();
        int len2 = num2.size();
        int c = 0, p1 = len1-1, p2 = len2-1;
        int t1, t2;
        while (p1>=0 || p2>=0) {
            if (p1 >= 0)
                t1 = num1[p1] - 48;
            else 
                t1 = 0;
            if (p2 >= 0)
                t2 = num2[p2] - 48;
            else 
                t2 = 0;
            ans.push_back((t1+t2+c)%10 + 48);
            c = (t1+t2+c) / 10;
            p1--, p2--;
        }
        if (c > 0)
            ans.push_back(c+48);
        reverse(ans.begin(), ans.end());
        return ans;
    }
};

posted @ 2022-01-16 17:33  ARUI丶  阅读(113)  评论(0编辑  收藏  举报