版权声明:个人笔记,仅供复习 https://blog.csdn.net/weixin_42373330/article/details/84260677
题目链接:大数乘法 V2
1028 大数乘法 V2
2 秒 131,072 KB 80 分 5 级题
给出2个大整数A,B,计算A*B的结果。
输入
第1行:大数A
第2行:大数B
(A,B的长度 <= 100000,A,B >= 0)
输出
输出A * B
输入样例
123456
234567
输出样例
28958703552
先贴上别人关于这题的评论,虽然看不懂:
NTT(NumberTheoreticTransforms),即为日本电报电话公司快速数论变换。
有关NTT和FFT的博客
超时的c++语言程序如下:
#pragma comment(linker, "/STACK:10240000,10240000")
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
#define ll long long
const ll mod=1e9+7;
const int N=1e5+10;
int main()
{
char a_str[N], b_str[N];
int a[N], b[N],c[2*N];
while(scanf("%s%s",a_str,b_str)!=EOF)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
int alen=strlen(a_str);
int blen=strlen(b_str);
for(int i=0;i<alen;i++)
{
a[alen-i-1]=a_str[i]-'0';
}
for(int i=0;i<blen;i++)
{
b[blen-i-1]=b_str[i]-'0';
}
int len=max(alen,blen);
for(int i=0;i<alen;i++)
{
for(int j=0;j<blen;j++)
{
c[i+j]+=a[i]*b[j];
c[i+j+1]+=c[i+j]/10;
c[i+j]%=10;
}
}
for(int i=0;i<alen+blen+2;i++)
{
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}
int cnt=2*len+2;
while(cnt>=0&&c[cnt]==0) cnt--;
if(cnt<0)
{
printf("0\n");
continue;
}
else
{
for(int i=cnt;i>0;i--)
{
printf("%d",c[i]);
}
printf("%d\n",c[0]);
}
}
return 0;
}
AC的c++语言程序如下: