问题 4373 --麦森数(完善程序)

4373: 麦森数(完善程序)★★

时间限制: 1 Sec  内存限制: 128 MB
提交: 60  解决: 28
[提交][状态][命题人:]

题目描述

形如 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] 

输入

文件中只包含一个整数 P(1000<P<3100000)。

输出

第一行:十进制高精度数 2^P -1 的位数; 

第 2-11 行:十进制高精度数 2^P -1 的最后 500 位数字(每行输出 50 位,共输出 10 行,不足 500 位时高位补 0); 不必验证 2^P -1 与P是否为素数。

提示

只需输出五个空的答案,每行一个大写字母,一共五行

来源

[提交][状态]