python之寻找第n个默尼森数

原创 2018年04月17日 16:29:30

1.贴题

题目来自MOOC
《用Python玩转数据》(南京大学)
第二周编程作业


寻找第n个默尼森数。
代码格式如下:
def prime(num):

def monisen(no):
… …
return xxx

print(monisen(int(input()))) #此处不需要自己输入,只要写这样一条语句即可,主要完成monisen()函数(4分)
经典程序设计问题:找第n个默尼森数。P是素数且M也是素数,并且满足等式M=2**P-1,则称M为默尼森数。例如,P=5,M=2**P-1=31,5和31都是素数,因此31是默尼森数。
输入格式:按提示用input()函数输入
输出格式:int类型
输入样例:4
输出样例:127

时间限制:500ms内存限制:32000kb


2.说明

题目还给出了格式,降低了难度。主要思路是通过定义两个函数,其中第一个函数用来判断是不是素数,第二个函数用来判断是不是默尼森数并控制输出第几个默尼森数。

首先是判断是不是素数的函数,这个函数也是初学者必然要进行练手的。思路为从2开始(因为判断能不能被1整除没有意义)到它本身减一,是否没有数可以被整除,如果没有的话就是素数,否则不是。而通过数学知识可以知道上界可以降低到它本身的平方根,因为如果一个数如果可以分解为两个数的因子,那么它的因子的小的那一个一定会小于或等于它的平方根。因为一个数的平方根可以不是整数,所以一般的做法是将平方根取整数部分然后加一作为上界。

判断是不是默尼森数在本次代码中使用了逐个加一的方式,属于笨办法。

3.参考代码

import math #要用到平方根的函数,所以要导入math库
def prime(num): #判断是否为素数的函数,返回真或假代表是素数或不是素数
    flag = True #首先预置flag为真
    for i in range(2,int(math.sqrt(num))+1): #从2到平方根取整加一的循环
        if num%i == 0: #判断是否整除
            flag = False #如果整除则将flag改为假
            return flag #返回flag为假,结束函数
    return flag #如果找不到整除的数,则范围flag为真,结束函数


def monisen(no): #判断是不是默尼森数并控制输出第几个默尼森数
    p = 5 #p从5开始,因为判断素数的函数采用了平方根取整加一的上界,不可以对4及以下的数进行判断,否则会报错
    if no == 1: #手动分支第一个和第二个默尼森数
        return 3
    elif no == 2:
        return 7
    else:
        while no>2:  #经过手动验证p=2,m=3;p=3,m=7是第一和第二个默尼森数,因此循环次数要减少两次
            if prime(p): #判断p是否为素数
                m = 2 ** p -1 #根据公式计算m
                if prime(m): #判断m是否为素数
                    no -= 1 #如果m为素数,则说明找到一个默尼森数,no减一
            p += 1 #p加一准备进入下一个循环
        return  m #返回第no个默尼森数

print(monisen(int(input()))) #执行函数

4.后记

写完代码和说明后又去网上查了人家写的代码,大概看了看思路都是大同小异,有的大神采用缓存保存素数来着,过程太复杂了等以后再研究。

学到了一个导入时间库看程序运行时间的,码!

import time
#中间是我的源代码,与上面的参考代码相同
import math
def prime(num):
    flag = True
    for i in range(2,int(math.sqrt(num))+1):
        if num%i == 0:
            flag = False
            return flag
    return flag


def monisen(no):
    p = 5
    if no == 1:
        return 3
    elif no == 2:
        return 7
    else:
        while no>2: 
            if prime(p):
                m = 2 ** p -1
                if prime(m):
                    no -= 1
            p += 1
        return  m
#函数定义结束

start = time.clock()
print(monisen(int(input()))) 
end = time.clock()
print("time: %f s" % (end - start))

当输入为8时,输出结果为

2147483647
time: 0.005812 s

5.疑问

在判断是否是默尼森数是,判断完p后判断下一个p时,采用了加一的方法,不知道是否有相关的数学证明可以减少判断次数,即增加步长。

Python - 寻找第n个默尼森数

题目内容:找第n个默尼森数。P是素数且M也是素数,并且满足等式M=2**P-1,则称M为默尼森数。例如,P=5,M=2**P-1=31,5和31都是素数,因此31是默尼森数。 输入格式:用in...
  • qq_28954601
  • qq_28954601
  • 2016-10-01 14:53:03
  • 1868

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

寻找第n个默尼森数。 代码格式如下: def prime(num):   ... def monisen(no):   … …   return xxx print monisen(in...
  • yuyu391
  • yuyu391
  • 2016-10-01 22:08:39
  • 2874

Python寻找第N个默尼森数

寻找第n个默尼森数。 代码格式如下: def prime(num): … def monisen(no): … … return xxx print(monisen(int(input()))) #此...
  • xyisv
  • xyisv
  • 2017-10-11 10:02:22
  • 429

Python:寻找第n个默尼森数

寻找第n个默尼森数。
  • Estel_
  • Estel_
  • 2017-06-08 23:26:33
  • 1820

[.py]寻找第n个默尼森数(初级版)

经典程序设计问题:找第n个默尼森数。 P是素数且M也是素数,并且满足等式M=2^P-1,则称M为默尼森(monisen)数。 例如,P=5,M=2**P-1=31,5和31都是素数,因此3...
  • sinat_38863494
  • sinat_38863494
  • 2017-05-20 15:31:12
  • 2059

Python数据研究 寻找第N个默尼森数(2016/10)

题目内容:找第n个默尼森数。P是素数且M也是素数,并且满足等式M=2**P-1,则称M为默尼森数。例如,P=5,M=2**P-1=31,5和31都是素数,因此31是默尼森数。 输入格式:用inp...
  • qq_33468857
  • qq_33468857
  • 2016-10-06 18:59:59
  • 972

Python 寻找第n个尼尔森系数

寻找第n个默尼森数。 代码格式如下: def prime(num):   ... def monisen(no):   … …   return xxx pr...
  • qhw5279
  • qhw5279
  • 2016-10-02 15:22:51
  • 749

找出7个默森尼数,法国数学家默森尼曾提出下列公式:Mp=2^p-1。当p是素数,Mp也是素数时,称Mp为默森尼数, 例如,p=5,Mp=2^5-1=31,5和31都是素数,因此31是默森尼数;而Mp

#include #include //判断Mp是否为素数 int prime1(int Mp) { int i; for(i = 2;i { if(Mp % i...
  • a_studycx
  • a_studycx
  • 2016-10-29 21:35:15
  • 837

寻找第n个默尼森数

经典程序设计问题:找第n个默尼森数。P是素数且M也是素数,并且满足等式M=2**P-1,则称M为默尼森数。例如,P=5,M=2**P-1=31,5和31都是素数,因此31是默尼森数。 输入格式:按提...
  • m77413432
  • m77413432
  • 2017-07-09 12:58:49
  • 182

python 寻找前5个默尼森数

python2 默尼森数 素数 while循环 for循环
  • sxingming
  • sxingming
  • 2016-05-04 19:50:48
  • 1768
收藏助手
不良信息举报
您举报文章:python之寻找第n个默尼森数
举报原因:
原因补充:

(最多只允许输入30个字)