题目连接
https://leetcode.com/problems/multiply-strings/
Multiply Strings
Description
Given two numbers represented as strings, return multiplication of the numbers as a string.
Note: The numbers can be arbitrarily large and are non-negative.
普通写法:
class Solution {
public:
string multiply(string num1, string num2) {
int n = num1.size(), m = num2.size();
if (num1 == "0" || num2 == "0") return "0";
ans = "";
int len = n + m + 10;
ret = new int[len];
memset(ret, 0, sizeof(int)* (len));
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
ret[i + j] += (num1[i] - '0') * (num2[j] - '0');
}
}
for (int i = 0; i < len - 1; i++) {
if (ret[i] > 9) {
ret[i + 1] += ret[i] / 10;
ret[i] %= 10;
}
}
int j = len - 1;
while (!ret[j]) j--;
for (int i = j; ~i; i--) ans += (char)(ret[i] + '0');
delete []ret;
return ans == "" ? "0" : ans;
}
private:
string ans;
int *ret, len;
};
文艺写法:
class Solution(object):
def multiply(self, num1, num2):
return str(int(num1) * int(num2))
2B写法:
class Complex {
public:
Complex(double _r_ = 0.0, double _i_ = 0.0) :r(_r_), i(_i_) {}
~Complex() {}
inline Complex operator+(const Complex &x) const{
return Complex(r + x.r, i + x.i);
}
inline Complex operator-(const Complex &x) const{
return Complex(r - x.r, i - x.i);
}
inline Complex operator*(const Complex &x) const{
return Complex(r * x.r - i * x.i, r * x.i + i * x.r);
}
public:
double r, i;
};
class FastFourierTransform {
public:
FastFourierTransform() = default;
FastFourierTransform(const string s1, const string s2) {
int i = 0;
ans = "";
N = 1, len1 = s1.length(), len2 = s2.length();
while (N < len1 << 1 || N < len2 << 1) N <<= 1;
x1 = new Complex[N + 1];
x2 = new Complex[N + 1];
for (i = 0; i < len1; i++) {
x1[i].r = s1[len1 - i - 1] - '0';
x1[i].i = 0.0;
}
for (; i < N; i++) x1[i].r = x1[i].i = 0.0;
for (i = 0; i < len2; i++) {
x2[i].r = s2[len2 - i - 1] - '0';
x2[i].i = 0.0;
}
for (; i < N; i++) x2[i].r = x2[i].i = 0.0;
}
~FastFourierTransform() { delete[]x1; delete[]x2; delete[]ret; }
inline string work() {
int i = 0;
ret = new int[N + 1];
memset(ret, 0, sizeof(int)* (N + 1));
fft(x1, N, 1);
fft(x2, N, 1);
for (i = 0; i < N; i++) x1[i] = x1[i] * x2[i];
fft(x1, N, -1);
for (i = 0; i < N; i++) ret[i] = (int)(x1[i].r + 0.5);
for (i = 0; i < N; i++) {
ret[i + 1] += ret[i] / 10;
ret[i] %= 10;
}
i = len1 + len2 - 1;
while (ret[i] <= 0 && i > 0) i--;
for (; ~i; i--) ans += (char)(ret[i] + '0');
return ans;
}
private:
string ans;
Complex *x1, *x2;
int N, len1, len2, *ret, *vis;
const double Pi = acos(-1.0);
inline void brc(Complex *y, int N) {
int i, j, k, ret = N >> 1;
for (i = 1, j = N >> 1; i < N - 1; i++) {
if (i < j) swap(y[i], y[j]);
k = ret;
while (j >= k) {
j -= k;
k >>= 1;
}
if (j < k) j += k;
}
}
inline void fft(Complex *&y, int N, double on) {
int i, j, h, k;
Complex u, t;
brc(y, N);
for (h = 2; h <= N; h <<= 1) {
Complex wn(cos(on * 2 * Pi / h), sin(on * 2 * Pi / h));
for (j = 0; j < N; j += h) {
Complex w(1, 0);
for (k = j; k < j + h / 2; k++) {
u = y[k];
t = w * y[k + h / 2];
y[k] = u + t;
y[k + h / 2] = u - t;
w = w * wn;
}
}
}
if (-1 == on) for (i = 0; i < N; i++) y[i].r /= N;
}
};
class Solution {
public:
string multiply(string num1, string num2) {
if (num1 == "0" || num2 == "0") return "0";
ret = new FastFourierTransform(num1, num2);
ans = ret->work();
delete ret;
return ans;
}
private:
string ans;
FastFourierTransform *ret;
};