上来就看到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; }