//2的p次方和2的p次方减一位数一样
//根据数学公式可以求出2的p次方的位数等于p*log10^2的p次方和2的p次方减一位数+1;
/*
快速幂
如果指数是奇数 底数拿出来一个
如果指数的偶数,底数平方指数减半
*/
/*
p表示指数,f表示底数,rev表示系数
如果指数的偶数那么就2的p次方等价于求4的二分之p次方
*/
#include<bits/stdc++.h>
using namespace std;
int p;
int rev[1100],f[1100],sav[1100];
void cheng1(){//如果p是奇数就拿一个底数出来
memset(sav,0,sizeof(sav));
for(int i=1;i<=500;i++){
for(int j=1;j<=500;j++){
//两个高精度的乘法
sav[i+j-1]+=rev[i]*f[j];
sav[i+j]+=sav[i+j-1]/10;
sav[i+j-1]%=10;
}
}
memcpy(rev,sav,sizeof(rev));//乘完后数据还是要存在rev里
}
void cheng2(){//如果指数是偶数那么就将指数减半底数平方
memset(sav,0,sizeof(sav));
for(int i=1;i<=500;i++){
for(int j=1;j<=500;j++){
//两个高精度的乘法
sav[i+j-1]+=f[i]*f[j];
sav[i+j]+=sav[i+j-1]/10;
sav[i+j-1]%=10;
}
}
memcpy(f,sav,sizeof(f));
}
int main(){
cin>>p;
cout<<(int)(p*log10(2)+1);//求2的p次方的位数
rev[1]=1;
f[1]=2;//f里面存的是底数
// cout<<(int)(p*log10(2)+1);//求出2的p次方的位数
while(p!=0){
if(p%2==1){
cheng1();
}
p/=2;
cheng2();
}
rev[1]--;
for(int i=500;i>=1;i--){
if(i%50==0) cout<<endl;
cout<<rev[i];
}
return 0;
}
1045快速幂+高精度*高精度
最新推荐文章于 2024-06-09 05:17:51 发布