为何p>=8192时错误

P1045 [NOIP2003 普及组] 麦森数

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,然后再求平方不就行了??


|