加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

大数乘法 V2

发布时间:2020-12-14 04:51:10 所属栏目:大数据 来源:网络整理
导读:给出2个大整数A,B,计算A*B的结果。 Input 第1行:大数A第2行:大数B(A,B的长度?=?100000,A,B?=?0) Output 输出A?*?B Input示例 123456234567 Output示例 28958703552 #include iostream#include stdio.h#include cmath#include algorithm#include cstring
给出2个大整数A,B,计算A*B的结果。
Input
第1行:大数A
第2行:大数B
(A,B的长度?<=?100000,A,B?>=?0)
Output
输出A?*?B
Input示例
123456
234567
Output示例
28958703552
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int N = 5e5 + 10;
const double PI = acos(-1.0);
struct Vir
{
    double re,im;
    Vir(double _re = 0.0,double _im = 0.0) :re(_re),im(_im)
	{}
    Vir operator*(Vir r) 
	{ 
		return Vir(re*r.re - im*r.im,re*r.im + im*r.re); 
	}
    Vir operator+(Vir r) 
	{ 
		return Vir(re + r.re,im + r.im); 
	}
    Vir operator-(Vir r) 
	{ 
		return Vir(re - r.re,im - r.im); 
	}
};

void bit_rev(Vir *a,int loglen,int len)
{
    for (int i = 0; i < len; ++i)
    {
        int t = i,p = 0;
        for (int j = 0; j < loglen; ++j)
        {
            p <<= 1;
            p = p | (t & 1);
            t >>= 1;
        }
        if (p < i)
        {
            Vir temp = a[p];
            a[p] = a[i];
            a[i] = temp;
        }
    }
}

void FFT(Vir *a,int len,int on)
{
    bit_rev(a,loglen,len);

    for (int s = 1,m = 2; s <= loglen; ++s,m <<= 1)
    {
        Vir wn = Vir(cos(2 * PI*on / m),sin(2 * PI*on / m));
        for (int i = 0; i < len; i += m)
        {
            Vir w = Vir(1.0,0);
            for (int j = 0; j < m / 2; ++j)
            {
                Vir u = a[i + j];
                Vir v = w*a[i + j + m / 2];
                a[i + j] = u + v;
                a[i + j + m / 2] = u - v;
                w = w*wn;
            }
        }
    }
    if (on == -1)
    {
        for (int i = 0; i < len; ++i) a[i].re /= len,a[i].im /= len;
    }
}
char a[N/2],b[N/2];
Vir pa[N],pb[N];
int ans[N];

int main()
{
	scanf("%s%s",a,b);
   
    int lena = strlen(a);
    int lenb = strlen(b);
    int n = 1,loglen = 0;
    while (n < lena + lenb) 
	{
	    n <<= 1,loglen++;
	}
    for (int i = 0,j = lena - 1; i < n; ++i,--j)
	{
		pa[i] = Vir(j >= 0 ? a[j] - '0' : 0.,0.);
	}
    for (int i = 0,j = lenb - 1; i < n; ++i,--j)
	{
        pb[i] = Vir(j >= 0 ? b[j] - '0' : 0.,0.);
	}
    for (int i = 0; i <= n; ++i) 
	{
		ans[i] = 0;
	}

    FFT(pa,n,1);
    FFT(pb,1);
    for (int i = 0; i < n; ++i)
    {
	    pa[i] = pa[i] * pb[i];
	}
    FFT(pa,-1);

    for (int i = 0; i < n; ++i) 
	{
		ans[i] = pa[i].re + 0.5;
	}
    for (int i = 0; i<n; ++i) 
	{
		ans[i + 1] += ans[i] / 10,ans[i] %= 10;
	}

    int pos = lena + lenb - 1;
    for (; pos>0 && ans[pos] <= 0; --pos);
    {  
		for (; pos >= 0; --pos) 
		{
			printf("%d",ans[pos]);
		}
		puts("");
	}
    
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读