形如 2^P-1 的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2^P-1 不一定也是素数。到 1998 年底,人们已找到了 37 个麦森数。最大的一个是P=3021377,它有 909526 位。麦森数有许多重要应用,它与完全数密切相关。
任务:输入P(1000<P<3100000),计算 2^P-1 的位数和最后 500 位数字(用十进制高精度数表示)。
#include<bits/stdc++.h> using namespace std; #define LEN 125 int n,i,j,out[501],sta[1001]; void multiply(int *a, int *b) { int i,j,nCarry,nTemp,c[LEN]; memset(c,0,sizeof(c)); for(i=0;i<LEN;i++) { nCarry=0; for(j=0;_____(1)______;j++) { nTemp=c[i+j]+a[j]*b[i]+nCarry; c[i+j]=nTemp%10000; nCarry=nTemp/10000; } } memcpy(a,c,LEN*sizeof(int)); } int main() { int i,p,anPow[LEN],aResult[LEN]; scanf("%d",&p); printf("%d\n",(int)(p*log10(2))+1); memset(anPow,0,sizeof(anPow)); memset(aResult,0,sizeof(aResult)); anPow[0]=2; aResult[0]=1; while(____(2)_____) { if(_____(3)______) multiply(aResult,anPow); p>>=1; multiply(anPow,anPow); } aResult[0]--; for (i=LEN-1;i>=0;i--) { if(_____(4)______) printf("%02d\n%02d",aResult[i]/100,aResult[i]%100); else { printf("%04d",____(5)_____); if(i%25==0) printf("\n"); } } return 0; }
(1)答案为
A. j<LEN B. j<LEN-i-1 C. j<LEN-i D. j<1
(2)答案为
A. p>0 B. p==0 C. p<0 D. p>=0
(3)答案为
A. p&1 B. p C. p||1 D. p==0
(4)答案为
A. i!=0 B. i>0 C. i%10==0 D. i%25==12
(5)答案为
A. aResult[i]/100 B. aResult[LEN-1-i] C. aResult[LEN-i] D. aResult[i]