zoukankan      html  css  js  c++  java
  • p1142

      上来就看到500位数.嗯,高精度无疑了.

      然后来想第一问:      

        通过http://wenku.baidu.com/view/b2ca872014791711cd79170b.html  我得知一个大数的位数是它因子位数的和.虽然和本题有一点不同,但是因数也可以分成p个2.那么位数就成为了int(p*log10(double(2))+1).第一问解决.

      然后第二问:

        这也不是很难嘛,每次乘上2就行.高精度乘一位数我还是会的啊.很自信的写了出来,交了后当然有大数据过不了.算一算时间复杂度,尴尬。。。

        然后就自然的想到了快速幂。因为省选的时候对这玩意印象非常的深。那么关于a=a*b.b=b*b怎么弄呢?

        作为500位的大数,依旧直接覆盖的话是不行的,会影响下一步的运算。就这个问题,我想了两天,两天!

        然后才想到可以临时用一个数组把大数存一下,心疼自己的智商。于是就完成了本题。

    using namespace std;
    int i,f,      p,t ,lena,lenb;
    int a[2000],b[2000],ta[2000],tb[2000];//用结构体是不可能的,只要不需要排序
    void aab()//a=a*b;
    {
        for(i=1;i<=lena;i++)
        {
            ta[i]=a[i];
            a[i]=0;
        }
        t=lena;
        for(i=1;i<=lena;i++)
            for(f=1;f<=lenb;f++)
            {
                int k=i+f-1;
                a[k]+=ta[i]*b[f];
                while(a[k]>=10)
                {
                    a[k+1]+=a[k]/10;
                    a[k]%=10;
                    k++;
                }
                if(k>t)t=k;
            }
        lena=min(t,510);
        while((a[lena]==0)&&(lena>1))    lena--;
    }
    void bbb()
    {
        for(i=1;i<=lenb;i++)
        {
            tb[i]=b[i];
            b[i]=0;
        }
        t=lenb;
        for(i=1;i<=lenb;i++)
            for(f=1;f<=lenb;f++)
            {
                
                int k=i+f-1;            
                b[k]+=tb[i]*tb[f];
                while(b[k]>=10)
                {
                    b[k+1]+=b[k]/10;
                    b[k]%=10;
                    k++;
                }
                if(k>t)t=k;
            }
        lenb=min(t,510);
        while((b[lenb]==0)&&(lenb>1))lenb--;
    
    }
    int main()
    {ios::sync_with_stdio(false);
        cin>>p;
        cout<<int(p*log10(2.0)+1)<<endl;
    //////////////////////////////////////////
        lena=1;
        lenb=1;
        a[1]=1;
        b[1]=2;
        while(p!=0)
        {
            
            if(p&1)
            {
                aab();//a=a*b;
            }
            p>>=1;
            bbb();//b=b*b;
        }
        for(i=500;i>1;i--)cout<<a[i];
        cout<<a[i]-1;
    }
    p1142
  • 相关阅读:
    Jmeter断言设置
    jmeter设置自动启动时间
    jmeter用命令行运行jmx脚本
    jmeter多用户并发压力测试(导入文件)
    Fiddler导出接口抓包数据
    postman和postwoman
    UVa10561
    UVa11859
    Ferguson游戏
    UVa11916
  • 原文地址:https://www.cnblogs.com/qywyt/p/8971221.html
Copyright © 2011-2022 走看看