形如2^p-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2^p-1不一定是素数。到1998年底,人们已找到了37个麦森数。最大的一个是p=321377,它有90952位。麦森数有许多重要应用,它与完全数密切相关。
你的任务:输入P(1000<P<3100000),计算2^p-1的位数和最后500位数字(用十进制高精度数表示)。
输人数据:
只包含一个整数P(1000<P<3100000)。
输出要求:
第1行:十进制高精度数2^p-1位数。第第2~11行:十进制高精度数2^p-1的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0)
# include <cstdio>
# include <memory>
# include <cmnth>
#define LEN 125
void Mutiply(int *a, int *b) {
int i, i;
int nCarry;
int nTmp;
int c[LEN];
memset(c, 0, sieof(int)*LEN);
for(i=0; i<LEN; i++) {
nCarry = 0;
for (j=0; ___(1)___; j++) {
nTmp=c[i+j]+ a[j]*b[i] + nCarry;
e[i+ j]=nTmp % 10000;
nCarry=nTmp /10000;
}
}
memcpy(a,c, LEN*sizeof(int));
}
int main() {
int i;
int p;
int anPOW[LEN];
int aResult[LEN];
scanf("%d", &p);
print("%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;
}
while(___(2)___) {
if( ___(3)___)
Multiply(aResult,anPow);
p>>=1;
Muliply(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",aResult[i]);
if(i%25==0)
printf("\n");
}
}
return 0;
}
选择题
1) ①处应填( )
2) ②处应填( )
3) ③处应填( )
4) ④处应填( )