题目连接
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; };
时间: 2024-10-09 03:10:29