• hdu 1402 A * B Problem Plus


    A * B Problem Plus 

    Calculate A * B. 
    Input
    Each line will contain two integers A and B. Process to end of file. 


    Note: the length of each integer will not exceed 50000. 
    Output
    For each case, output A * B in one line. 
    Sample Input
    1
    2
    1000
    2
    Sample Output
    2
    2000

    求A*B,多存几位就可以过,或者用FFT

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    using namespace std;
    int a[50100];
    long long A[50100];
    long long B[50100];
    int b[50100];
    long long ans[1000001];
    int main()
    {
        string s1,s2;
        while(cin>>s1>>s2)
        {
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            memset(A,0,sizeof(A));
            memset(B,0,sizeof(B));
            memset(ans,0,sizeof(ans));
            int l=0,r=0;
            if(s1=="0"||s2=="0")
            {
                printf("0
    ");
                continue;
            }
            for(int i=s1.size()-1; i>=0; i--)
                a[l++]=s1[i]-'0';
            for(int i=s2.size()-1; i>=0; i--)
                b[r++]=s2[i]-'0';
            int L=0,R=0;
            for(int i=0; i<l; i+=6)
            {
                A[L++]=a[i+5]*100000+a[i+4]*10000+a[i+3]*1000+a[i+2]*100+a[i+1]*10+a[i];
                //cout<<A[L-1];
            }
            for(int i=0; i<r; i+=6)
            {
                B[R++]=b[i+5]*100000+b[i+4]*10000+b[i+3]*1000+b[i+2]*100+b[i+1]*10+b[i];
                //cout<<B[R-1];
            }
            long long p;
            for(int i=0; i<L; i++)
            {
                long long c=0;
                for(int j=0; j<R; j++)
                {
                    long long temp=A[i]*B[j]+ans[i+j]+c;
                    //cout<<temp<<endl;
                    ans[i+j]=temp%1000000;
                    c=temp/1000000;
                    p=j;
                }
                if(c)
                    ans[i+p+1]=c;
            }
            int x=L+R;
            for(x; ans[x]==0; x--);
            printf("%lld",ans[x]);
            x--;
            for(x; x>=0; x--)
                printf("%06lld",ans[x]);
            cout<<endl;
        }
    }
    

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    const double PI=acos(-1.0);
    struct Complex
    {
        double x,y;
        Complex(double _x=0.0,double _y=0.0)
        {
            x=_x;
            y=_y;
        }
        Complex operator-(const Complex &b)const{return Complex(x-b.x,y-b.y);}
        Complex operator+(const Complex &b)const{return Complex(x+b.x,y+b.y);}
        Complex operator*(const Complex &b)const{return Complex(x*b.x-y*b.y,x*b.y+y*b.x);}
    };
    void change(Complex y[],int len)
    {
        int i,j,k;
        for(i=1,j=len/2;i<len-1;i++)
        {
            if(i<j)swap(y[i],y[j]);
            k=len/2;
            while(j>=k)
            {
                j-=k;
                k/=2;
            }
            if(j<k)j+=k;
        }
    }
    void fft(Complex y[],int len,int on)
    {
        change(y,len);
        for(int h=2;h<=len;h<<=1)
        {
            Complex wn(cos(-on*2*PI/h),sin(-on*2*PI/h));
            for(int j=0;j<len ;j+=h)
            {
                Complex w(1,0);
                for(int k=j;k<j+h/2;k++)
                {
                    Complex u=y[k];
                    Complex t=w*y[k+h/2];
                    y[k]=u+t;
                    y[k+h/2]=u-t;
                    w=w*wn;
                }
            }
        }
        if(on==-1)
        {
            for(int i=0;i<len;i++)
            {
                y[i].x/=len;
            }
        }
    }
    const int MAXN=200010;
    Complex x1[MAXN],x2[MAXN];
    char str1[MAXN/2],str2[MAXN/2];
    int sum[MAXN];
    int main()
    {
        while(~scanf("%s%s",str1,str2))
        {
            int len1=strlen(str1);
            int len2=strlen(str2);
            int len=1;
            while(len<len1*2||len<len2*2)len<<=1;
            for(int i=0;i<len1;i++)
            x1[i]=Complex(str1[len1-1-i]-'0',0);
            for(int i=len1;i<len;i++)
            x1[i]=Complex(0,0);
            for(int i=0;i<len2;i++)
            x2[i]=Complex(str2[len2-1-i]-'0',0);
            for(int i=len2;i<len;i++)
                x2[i]=Complex(0,0);
            fft(x1,len,1);
            fft(x2,len,1);
            for(int i=0;i<len;i++)
            x1[i]=x1[i]*x2[i];
            fft(x1,len,-1);
            for(int i=0;i<len;i++)
            sum[i]=(int)(x1[i].x+0.5);
            for(int i=0;i<len;i++)
            {
                sum[i+1]+=sum[i]/10;
                sum[i]%=10;
            }
            len=len1+len2-1;
            while(sum[len]<=0&&len>0)len--;
            for(int i=len;i>=0;i--)
                printf("%c",sum[i]+'0');
            printf("
    ");
        }
        return 0;
    }
    




  • 相关阅读:
    ubuntu安装node.js+express+mongodb
    Linux(Ubuntu)下安装NodeJs
    Nodejs的Express完成安装指导
    【详解】ERP、APS与MES系统是什么?
    linux常用命令
    Linux命令集合
    sql 以逗号分割成多行数据
    【项目管理工具】SVN
    富文本编辑器
    cookie的跨页面传值
  • 原文地址:https://www.cnblogs.com/da-mei/p/9053307.html
Copyright © 2020-2023  润新知