51nod 大数乘法V2 解题报告

版权声明:个人笔记,仅供复习 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++语言程序如下:

猜你喜欢

转载自blog.csdn.net/weixin_42373330/article/details/84260677