计算麦森数的高精度乘法运算,求解
【问题描述】形如2^P-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2^P-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。 任务:输入P(1000<P<3100000),计算2^P -1的位数和最后500位数字(用十进制高精度数表示)这个程序将大整数表示为10000进制的,具体的不懂。
表示看不懂这个程序,有几个问题:
1.anPow存放的到底是什么?为什么初始化为2而不是1?
2.子函数的计算思路
求大神解析!!
程序代码:
#include<stdio.h> #include<string.h> #define LEN 125 #include<math.h> void Multiply(int *a,int *b) //此函数的功能是计算高精度乘法a*b,结果的末500位放在a中 { int i,j; int nCarry; //存放进位 int nTmp; int c[LEN]; //存放结果的末500位 memset(c,0,sizeof(int)*LEN); for(i=0;i<LEN;i++) { nCarry=0; for(j=0;j<LEN-i;j++) { nTmp=c[i+j]+a[j]*b[i]+nCarry; c[i+j]=nTmp%10000; nCarry=nTmp/10000; } } memcpy(a,c,LEN*sizeof(int)); } void main() { int i,p; int anPow[LEN]; //存放不断增长的2的次幂 int aResult[LEN];//存放结果的末500位 scanf("%d",&p); printf("%d\n",(int)(p*log10(2))+1); anPow[0]=2; aResult[0]=1; for(i=1;i<LEN;i++) { anPow[i]=0; aResult[i]=0; } //下面计算2的p次方 while(p>0) { if(p&1) Multiply(aResult,anPow); p>>=1; Multiply(anPow,anPow); } aResult[0]--; //结果减一 for(i=LEN-1;i>=0;i--) { if(i%25==12) printf("%02d\n%02d",aResult[i]/100,aResult[i]%100); else { printf("%04d",aResult[i]); if(i%25==0) printf("\n"); } } }
[ 本帖最后由 wwfdzh2012 于 2013-4-22 21:43 编辑 ]