给出2个大整数A,B,计算A*B的结果。
Input
第1行:大数A 第2行:大数B (A,B的长度 <= 100000,A,B >= 0)
Output
输出A * B
如果用正常的大数乘法来做,会发现时间复杂度是的,显然是会TLE的,为了避免这种情况,我用一位数组存9位值,所以最后就可以是复杂度即使是的,但是N却变成了1e4,可以过去了。
然后,因为值变大了,所以每次乘完之后,就需要进位了,不然一位存储的信息就会被后面一次次的一位给充满了,1e4 * 1e9 * 1e9是肯定会超过long long的范围的。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
//#include <unordered_map>
//#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define eps 1e-8
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MP(x, y) make_pair(x, y)
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const ull mod = 1e9;
const int maxN = 1e5 + 7;
char s[maxN];
vector<ull> a, b, ans;
void In(vector<ull> & x)
{
x.clear();
int len = (int)strlen(s);
ull tmp;
ans.push_back(0);
for(int i=len - 1; i>=0; )
{
ans.push_back(0);
tmp = 0;
for(int j=max(0, i - 9 + 1); j<=i; j++)
{
tmp = tmp * 10LL + s[j] - '0';
}
x.push_back(tmp);
i -= 9;
}
}
void solve()
{
ull tmp;
for(int i=0; i<a.size(); i++)
{
for(int j=0; j<b.size(); j++)
{
ans[i + j] += a[i] * b[j];
if(ans[i + j] >= mod)
{
tmp = ans[i + j] / mod;
ans[i + j + 1] += tmp;
ans[i + j] = ans[i + j] - tmp * mod;
}
}
}
for(int i=0; i<ans.size(); i++)
{
if(ans[i] >= mod)
{
tmp = ans[i] / mod;
ans[i + 1] += tmp;
ans[i] = ans[i] - tmp * mod;
}
}
int len = (int)ans.size() - 1;
while(len >= 0 && !ans[len]) len--;
if(!~len) { len = 0; ans[0] = 0; }
printf("%lld", ans[len]);
for(int i=len - 1; i>=0; i--) printf("%.9lld", ans[i]);
printf("\n");
}
int main()
{
scanf("%s", s);
In(a);
scanf("%s", s);
In(b);
solve();
return 0;
}