Python初学 寻找第n个默尼森数

寻找第n个默尼森数。
代码格式如下:
def prime(num):  
...
def monisen(no):  
… …  
return xxx
print monisen(input()) #此处不需要自己输入,只要写这样一条语句即可,主要完成monisen()函数
# print(monisen(int(input()))) in Python 3.x (5分)
题目内容:找第n个默尼森数。P是素数且M也是素数,并且满足等式M=2**P-1,则称M为默尼森数。例如,P=5,M=2**P-1=31,5和31都是素数,因此31是默尼森数。
输入格式:用input()函数输入,注意如果Python 3中此函数的返回类型
输出格式:int类型
输入样例:4
输出样例:127
时间限制:500ms 内存限制:32000kb
# -*- coding: utf-8 -*-
"""
Created on Sat Oct 01 18:32:41 2016

@author: dukeyu
"""

from math import sqrt 


# 缓存默尼森数 
cacheMonisen = [] 

# 缓存素数 
cachePrime = [] 

# 素数范围,搜索更多的素数 
minNumber = 2 
maxNumber = 100

def isPrime(x): 
    '''判断是不是素数''' 
    k = int(sqrt(x)) 
    for i in range(2, k + 1): 
        if x % i == 0: 
            return False 
    return True 
def addCachePrime(): 
    '''增加素数缓存''' 
    for i in range(minNumber, maxNumber): 
        if isPrime(i) and (i not in cachePrime): 
            cachePrime.append(i) 
def monisen(no):
    '''求解第N个默尼森数'''
    
    # 初始化素数缓存 
    addCachePrime()
    
    if no <= len(cacheMonisen): 
        return cacheMonisen[no - 1]
        
    for i in cachePrime: 
        # M和P均为素数 
        p = i
        m = pow(2, p) - 1
        if isPrime(p) and isPrime(m):
            cacheMonisen.append(m) 
        if no == len(cacheMonisen): 
            break 
        
    if no == len(cacheMonisen):
        return cacheMonisen[-1]
        
    else: 
        # 素数范围不足,须增加素数,继续查找 
        global minNumber, maxNumber
        minNumber, maxNumber = maxNumber, maxNumber * 2 
        addCachePrime() 
        return monisen(no) 
print monisen(input())

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值