Leetcode-43-大数相乘
题目链接
题目描述
如标题
思路
-
首先要写一个大数加法,从右往左,按位相加,记录进位值。
-
从右向做,用一个乘数的每一位,去乘另一个乘数,相乘的积累加。
注意: 相乘的 积 要依次增加一个0.
即:123 × 456 = (100+20+3) × 456
时间复杂度:O(mn+n^2) -
有个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;
}
};