为何p>=8192时错误
查看原帖
为何p>=8192时错误
574847
tqychy楼主2021/11/2 19:56
#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……

2021/11/2 19:56
加载中...