• hdu1042(好大的数啊!)


    http://acm.hdu.edu.cn/showproblem.php?pid=1402

    我的代码,由于时间的问题,以后找机会优化了!(超时)

    View Code
    #include"iostream"
    #define M 100010
    using namespace std;
    char ch1[M],ch2[M];
    int a[M],b[M];
    int c[M],d[M];
    int num[M];
    int H[M];
    int t,k,g,v;
    int i,j;
    int La,Lb;
    int sign=0;
    void Add(int x ,int y)
    {
    sign
    =0; t=0;
    int p,q,flag=0;
    if(x>y)
    {
    for(p=0,q=0;p<y,q<y; p++,q++)
    {
    num[t
    ++]=(d[p]+H[q]+flag)%10;
    flag
    =(d[p]+H[q]+flag)%10;
    }
    for(p=y; p<x ; p++)
    {
    num[t
    ++]=(d[p]+flag)%10;
    flag
    =(d[p]+flag)/10;
    }
    }
    else if(x==y)
    {
    for(p=0,q=0;p<x,q<y; p++,q++)
    {
    num[t
    ++]=(d[p]+H[q]+flag)%10;
    flag
    =(d[p]+H[q]+flag)/10;
    }
    }

    else
    {
    flag
    =0;
    for(p=0,q=0;p<x,q<x; p++,q++)
    {
    num[t
    ++]=(H[p]+d[q]+flag)%10;
    flag
    =(H[p]+d[q]+flag)/10;
    }
    for(q=x;q<y;q++)
    {
    num[t
    ++]=(H[q]+flag)%10;
    flag
    =(H[q]+flag)/10;
    }
    }

    while(flag)
    {
    num[t
    ++]=flag%10;
    flag
    /=10;
    }

    for(int yy=0; yy<t;yy++)
    {
    d[yy]
    =num[yy];
    if(d[yy]==0) sign++; //sign用于标记都为结果0的情况
    }
    g
    =t;
    memset(H ,
    0 , sizeof(H));
    memset(num,
    0, sizeof(num));
    }

    void BigN()
    {
    int flag=0;
    int mark=0;
    if(La>Lb)
    {
    for(i=Lb-1;i>=0;i--)
    {
    k
    =0;
    for(j=La-1;j>=0;j--)
    {
    c[k
    ++]=(b[i]*a[j]+flag)%10;
    flag
    =(b[i]*a[j]+flag)/10;
    }

    while(flag)
    {
    c[k
    ++]=flag%10;
    flag
    /=10;
    }

    //末尾赋值0
    v=0;
    for(int xx=0; xx<mark; xx++)
    H[v
    ++]=0;
    for(int m=0;m<k;m++)
    H[v
    ++]=c[m];

    memset(c,
    0,sizeof(c));
    //****************************
    Add(g , v);
    mark
    ++;

    }
    }
    else
    {
    for(i=La-1;i>=0;i--)
    {
    k
    =0;
    for(j=Lb-1;j>=0;j--)
    {
    c[k
    ++]=(a[i]*b[j]+flag)%10;
    flag
    =(a[i]*b[j]+flag)/10;
    }
    while(flag)
    {
    c[k
    ++]=flag%10;
    flag
    /=10;
    }

    //末尾赋值0
    v=0;
    for(int xx=0; xx<mark; xx++)
    H[v
    ++]=0;
    for(int m=0;m<k;m++)
    H[v
    ++]=c[m];
    //****************************
    Add(g , v);

    mark
    ++;
    }
    }

    }

    int main()
    {
    while(cin>>ch1>>ch2)
    {
    t
    =0;k=0;g=0;

    La
    =strlen(ch1);
    Lb
    =strlen(ch2);

    for(i=0;i<La;i++) a[i]=ch1[i]-'0';
    for(i=0;i<Lb;i++) b[i]=ch2[i]-'0';

    BigN();

    if(sign!=t)
    {
    for(i=t-1;i>=0;i--)
    cout
    <<d[i];
    cout
    <<endl;
    }
    else cout<<"0"<<endl;
    }
    return 0;
    }

    一位dn的,神人啊!

    http://www.cppblog.com/misschuer/archive/2010/01/16/80356.html

    View Code
    #include<iostream>
    #include
    <cmath>
    using namespace std;
    typedef
    struct vir{
    double re,im;
    vir(){}
    vir(
    double a,double b){re=a;im=b;}
    vir
    operator +(const vir &b){ return vir(re+b.re,im+b.im);}
    vir
    operator -(const vir &b){ return vir(re-b.re,im-b.im);}
    vir
    operator *(const vir &b){ return vir(re*b.re-im*b.im,re*b.im+b.re*im);}
    }vir;
    vir x1[
    200005],x2[200005];
    const double Pi = acos(-1.0);
    void change(vir *x,int len,int loglen)
    {
    int i,j,k,t;
    for(i=0;i<len;i++)
    {
    t
    = i;
    for(j=k=0;j<loglen;j++,t>>=1)
    k
    = (k<<1)|(t&1);
    if(k<i)
    {
    vir wt
    = x[k];
    x[k]
    = x[i];
    x[i]
    = wt;
    }
    }
    }
    void fft(vir *x,int len,int loglen)
    {
    int i,j,t,s,e;
    change(x,len,loglen);
    t
    = 1;
    for(i=0;i<loglen;i++,t<<=1)
    {
    s
    = 0;
    e
    = s + t;
    while(s<len)
    {
    vir a,b,wo(cos(Pi
    /t),sin(Pi/t)),wn(1,0);
    for(j=s;j<s+t;j++)
    {
    a
    = x[j];
    b
    = x[j+t]*wn;
    x[j]
    = a + b;
    x[j
    +t] = a - b;
    wn
    =wn*wo;
    }
    s
    = e+t;
    e
    = s+t;
    }
    }
    }

    void dit_fft(vir *x,int len,int loglen)
    {
    int i,j,s,e,t=1<<loglen;
    for(i=0;i<loglen;i++)
    {
    t
    >>=1;
    s
    =0;
    e
    =s+t;
    while(s<len)
    {
    vir a,b,wn(
    1,0),wo(cos(Pi/t),-sin(Pi/t));
    for(j=s;j<s+t;j++)
    {
    a
    = x[j]+x[j+t];
    b
    = (x[j]-x[j+t])*wn;
    x[j]
    = a;
    x[j
    +t] = b;
    wn
    = wn*wo;
    }
    s
    = e+t;
    e
    = s+t;
    }
    }
    change(x,len,loglen);
    for(i=0;i<len;i++)
    x[i].re
    /=len;
    }


    int main()
    {
    char a[100005],b[100005];
    int i,len1,len2,t,over,len,loglen;

    while(scanf("%s%s",a,b)!=EOF)
    {
    len1
    = strlen(a)<<1;
    len2
    = strlen(b)<<1;
    len
    = 1;
    loglen
    = 0;
    while(len<len1)
    {
    len
    <<=1;
    loglen
    ++;
    }
    while(len<len2)
    {
    len
    <<=1;
    loglen
    ++;
    }
    for(i=0;a[i]!='\0';i++)
    {
    x1[i].re
    = a[i]-'0';
    x1[i].im
    = 0;
    }
    for(;i<len;i++)
    x1[i].re
    = x1[i].im = 0;
    for(i=0;b[i]!='\0';i++)
    {
    x2[i].re
    = b[i]-'0';
    x2[i].im
    = 0;
    }
    for(;i<len;i++)
    x2[i].re
    = x2[i].im = 0;
    fft(x1,len,loglen);
    fft(x2,len,loglen);
    for(i=0;i<len;i++)
    x1[i]
    = x1[i]*x2[i];
    dit_fft(x1,len,loglen);
    for(i=(len1+len2)/2-2,over=loglen=0;i>=0;i--)
    {
    t
    = x1[i].re + over + 0.5;
    a[loglen
    ++] = t%10;
    over
    = t/10;
    }
    while(over)
    {
    a[loglen
    ++] = over%10;
    over
    /= 10;
    }
    for(loglen--;loglen>=0&&!a[loglen];loglen--);
    if(loglen<0)
    putchar(
    '0');
    else
    for(;loglen>=0;loglen--)
    putchar(a[loglen]
    +'0');
    putchar(
    '\n');
    }
    return 0;
    }
  • 相关阅读:
    JasperReport html 导出
    mysql 序列号生成器 (自定义函数)
    [Java][Spring]Spring事务不起作用 问题汇总
    序列 mysql
    订单编号
    Mybatis
    SNMP 配置
    Gradle 1.12用户指南翻译——第三十八章. Eclipse 插件
    cocos2dx2.0 与cocos2dx3.1 创建线程不同方式总结
    Android实战简易教程-第二十八枪(Uri转String型实例)
  • 原文地址:https://www.cnblogs.com/FCWORLD/p/2034465.html
Copyright © 2020-2023  润新知