亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

求大神用Python,找前5個默尼森數!

求大神用Python,找前5個默尼森數!

yuantongxin 2016-04-20 11:14:00
找前5個默尼森數。P是素數且M也是素數,并且滿足等式M=2**P-1,則稱M為默尼森數。例如,P=5,M=2**P-1=31,5和31都是素數,因此31是默尼森數。
查看完整描述

5 回答

已采納
?
清波

TA貢獻165條經驗 獲得超90個贊

從另外一個問題中 搬來 素數判斷:

import?math
??
??
##?定義?素數?判斷函數
def?isprime(n):
????if?n!=int(n)?or?n<2:??##?此處稍作改進
????????return?False
????for?i?in?range(2,int(math.sqrt(n)+1)):
????????if?n?%?i?==0:
????????????return?False
????return?True
?????
?????
##?定義?默尼森數?判斷函數
def?ismonisen(n):
????if?isprime(math.log(n+1,2))?and?isprime(n):
????????return?True
????return?False
?????
?
##?至此,準備工作完畢,?也定義一個獲取?默尼森數的函數吧,這次傳進去?個整數,返回該數量的?默尼森數?列表:
def?get_monisen(n):
????if?n!=?int(n)?or?n<1:
????????return?[]
????x=3
????result=[3]
????while?True:
????????if?isprime(x)?and?isprime(2**x-1):
????????????result.append(2**x-1)
????????if?len(result)==n:
????????????return?result
????????x+=2
?????
?
##?測試:
print?(get_monisen(8))

[3,?7,?31,?127,?8191,?131071,?524287,?2147483647]


算是寫完了,做了一些無謂的判斷, 習慣使然。 ?結果題主驗證下,如果不對的話,我可以接著修改。。

再次修改, 優化get_monisen(), 可以算到8了。。

查看完整回答
3 反對 回復 2016-04-20
  • yuantongxin
    yuantongxin
    有異常; NameError: global name 'log' is not defined
  • 清波
    清波
    恩, log 少寫了, 應該是 math.log , 在 def ismonisen 中
  • 清波
    清波
    再次修改 get_monisen 函數,充分利用函數的 return 終止函數的功能,減少冗余代碼。
?
再見你

TA貢獻5條經驗 獲得超1個贊

寫了一個,但不是很簡便,如果有更好的方式,請告訴一下,謝謝。

import?math
a=0
b=1
L=[]
def?sushu(b):
	for?x?in?range(1,int(math.sqrt(b)+1)):
		if?x!=1?and?b%x==0:
			return?False
	return?True
while?True:
	if(a==5):
		break
	if?sushu(b):
		c=2**b-1
		if?sushu(c)?and?b!=c:
			L.append(c)
			a=a+1
	b=b+1
print?(L)


抱歉,以上代碼修改了一下,請再試一下

查看完整回答
1 反對 回復 2016-04-20
?
vero愛慕課

TA貢獻1條經驗 獲得超0個贊

import math


def prime(num):

? ? if num != int(num)?or?num < 2:

? ? ? ? return 0

? ? max = int(math.sqrt(num))

? ? for i in range(2,max+1):

? ? ? ? if num % i == 0:

? ? ? ? ? ? return 0

? ? return 1


def monisen(no):

? ? i = 0

? ? p = 1

? ? x = []

? ? while True:

? ? ? ? if prime(p):?

? ? ? ? ? ? if prime(2**p-1):?

? ? ? ? ? ? ? ? m = 2**p-1?

? ? ? ? ? ? ? ? x.append(m)

? ? ? ? ? ? ? ? i += 1

? ? ? ? ? ? ? ? if i == no:?

? ? ? ? ? ? ? ? ? ? return x?

? ? ? ? ? ? ? ? else:

? ? ? ? ? ? ? ? ? ? p += 1

? ? ? ? ? ? else:

? ? ? ? ? ? ? ? ? ? p += 1

? ? ? ? else:

? ? ? ? ? ? p += 1?


print(monisen(int(input())))

尋找前n個默尼森數的程序,鍵入8,結果為:[3,?7,?31,?127,?8191,?131071,?524287,?2147483647]


查看完整回答
反對 回復 2017-08-09
?
qq_滿兒燕_04214753

TA貢獻1條經驗 獲得超0個贊

from math import sqrt

def isprime(x):

? ? if x==1:

? ? ? ? return False

? ? k=int(sqrt(x))

? ? for j in range(2,k+1):

? ? ? ? if x%j==0:

? ? ? ? ? ? return False

? ? return True

__________________________________________________________________

def monisen():

? ? sum=0

? ? P=2

? ? print 'P M'

? ? while True:

? ? ? ? if isprime(P):

? ? ? ? ? ? M=2**P-1

? ? ? ? ? ? if isprime(M):

? ? ? ? ? ? ? ? print P,M

? ? ? ? ? ? ? ? sum+=1

? ? ? ? ? ? ? ? if sum==5:

? ? ? ? ? ? ? ? ? ? break ? ? ? ? ? ?

? ? ? ? P+=1 ? ?

___________________________________________________________________

調用:

>>> monisen()

P M

2 3

3 7

5 31

7 127

13 8191




查看完整回答
反對 回復 2016-10-16
?
UPC周偉偉

TA貢獻1條經驗 獲得超0個贊

import?math

def?isPrime(n):
????'judge?a?number?is?a?prime'
????if?n==1:
????????return?False
????k=int(math.sqrt(n))
????for?i?in?range(2,k+1):
????????if?n%i==0:
????????????return?False
????????????break
????return?True
????
def?getMonisen():
????count=0
????list=[]
????P=2
????while?True:
????????if?isPrime(P):
????????????M=2**P-1
????????????if?isPrime(M):
????????????????list.append(M)
????????????????count+=1
????????????????if?count==5:
????????????????????break
????????P+=1
????return?list
????
list=getMonisen()
print?list


查看完整回答
反對 回復 2016-04-24
  • 5 回答
  • 1 關注
  • 12071 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號