经典程序设计问题:找第n个默尼森数。
P是素数且M也是素数,并且满足等式M=2^P-1,则称M为默尼森(monisen)数。
例如,P=5,M=2**P-1=31,5和31都是素数,因此31是默尼森数。
本题要求input一个值k(k<9),输出第k个默尼森数
输入样例:4
输出样例:127
问题分析
按照自底向上的编程思想,要实现问题,则需要有以下几个部分:
判断一个数x是否为素数;
已知x为素数时,判断2^x-1是否为素数;
已知2^x-1是素数,则可知它是默尼森数,要知道它是第几个默尼森数;
其实为了简化问题,把k设置成了只计算前8个monisen数,因为实际上第8个monisen数是2^32-1,是signed int型数的可表示的最大值,写好了程序如果要计算更大的数,需要换用其它的数据格式,所以这里为了仅强调计算方法而不考虑更大的monisen数。
可以先试一下简单的情况:素数数列前几项k=[2,3,5,7,11,13,...],对应的2^k-1值是[3,7,31,127,2047,8191,...],其中前4项[3,7,31,127]都是默尼森数,而2047,8191不是质数,就不是默尼森数。
所以可以这样设计:
程序描述:
#输出第num个默尼森数
monisen(num):
若num<1,应报告ERROR
k=0
i=1
while(k<num):
t是第i个素数
i+=1
如果,2^t-1也是素数,则:
计数器k+=1;
跳出while循环时,k=num,直接输出2^t-1的值,即为第num个monisen数
</