tqychy @ 2021-11-02 19:56:31
#include<stdio.h>
#include<math.h>
void mul(char a[],char b[]);//高精度乘法。
int main()
{int i=0,j=0,p=0,n=0,k;
char a[1000]={'2','\0'};//因数1。
char b[2]={'2','\0'};//因数2.
scanf("%d",&p);
n=1+p*log(2.0)/log(10.0);
for(i=0;i<(int)(log(p*1.0)/log(2*1.0))-1;i++){mul(a,a);}//要用快速幂。
for(j=0;j<p-pow(2,i);j++){mul(a,b);}
a[0]--;//结果-1.
printf("%d\n",n);
for(i=499;i>=0;i--)
{
if(i>=n){printf("0");}
else{printf("%c",a[i]);}
if(i%50==0&&0!=i){printf("\n");}
}
return 0;
}
void mul(char a[],char b[])
{
int i=0,j=0,scale=0;
int midret[600]={0};
for(i=0;b[i]!='\0';i++){for(j=0;a[j]!='\0';j++){midret[j+i]+=(a[j]-'0')*(b[i]-'0');}}
midret[i+j-1]=-1;
for(i=0;midret[i]!=-1;i++)//统一处理进位。
{
scale=midret[i]/10;
midret[i]=midret[i]%10;
if(midret[1+i]==-1&&scale>0&&1+i<500) //处理位数变化。
{
midret[1+i]=scale;
midret[2+i]=-1;
}
else if(1+i>=500);
else{midret[1+i]+=scale;}
}
for(i=0;midret[i]!=-1;i++){a[i]='0'+midret[i];}
a[i]='\0';
}
p大于等于8192时段错误,是不是和内存有关,毕竟8192=2^13……
by Asbintle @ 2022-01-14 13:18:58
@tqychy 我感觉呢,其实这就是一道高精乘,你只需要2*P,然后再求平方不就行了??