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

 

posted @ 2018-04-29 16:15  zzuqy  阅读(138)  评论(0编辑  收藏  举报