社区讨论

为何p>=8192时错误

P1045[NOIP 2003 普及组] 麦森数参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lobf60bl
此快照首次捕获于
2023/10/29 20:00
2 年前
此快照最后确认于
2023/11/04 01:33
2 年前
查看原帖
C
#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……

回复

1 条回复,欢迎继续交流。

正在加载回复...