我正在使用 Python 3.9,并且我創建了一個非常簡單的程式來識別在整數輸入中給出的數字是否為質數。我的代碼本身可以作業,但即使給定大量(5000 萬 ),它也可能非常慢。我正在使用 for 回圈來檢查 1 和輸入(x)之間的任何數字是否可以被輸入(x)整除。我想從范圍中排除所有偶數和 5 的倍數,因為沒有素數是偶數或以 5 結尾。
有沒有辦法像我一樣顯式洗掉所有的偶數和 5 的倍數,而無需創建排除/包含值的陣列?以下是程式的片段代碼和時間以供參考:
#program with filtering out evens and multiples of 5
print("Is your number prime?? Well... let's check!")
#'x' can actually be any input but I am using 60000049 as a constant value for the sake of timing.
x=60000049
factorlist=[]
#Included_values is an array in which all elements are divided into 'x' after it excluded all evens and multiples of 5.
included_values=[]
for i in range (1,x 1):
if i%2!=0 or i%5!=0:
included_values.append(i)
for i in range(1,len(included_values)):
if x%included_values[i]==0:
factorlist.append(i)
if len(factorlist)>2:
print("Oh no! It appears like the number you have entered is not prime. Try again!")
print('The factors to your number are:',factorlist)
if len(factorlist)<=2:
print('Yay! You have chosen a prime number!!')
Yay! You have chosen a prime number!!
~17.96522307395935
我的程式的第一個版本比不排除任何值的版本慢得多:
#My program without filtering out evens or multiples of 5.
#'x' can actually be any number but I am using 60000049 for the sake of timing.
print("Is your number prime?? Well... let's check!")
x=60000049
factorlist=[]
for i in range (1,x 1):
if x%i==0:
factorlist.append(i)
if len(factorlist)>2:
print("Oh no! It appears like the number you have entered is not prime. Try again!")
print('The factors to your number are:',factorlist)
if len(factorlist)==2:
print('Yay! You have chosen a prime number!!')
Yay! You have chosen a prime number!!
~6.147368431091309
如您所見,我的第二個程式要快得多,因為它不會回圈遍歷范圍來首先獲取排除值的陣列。如果有一種方法可以先排除偶數和 5 的倍數而不在整個范圍 (1,x 1) 中回圈,這將使我的程式更快。如果這是可能的,請告訴我!
uj5u.com熱心網友回復:
要回答您的問題,您當然可以在 for 中使用 if 來跳過值。好吧,您已經這樣做了,但是使用串列。我的意思是你可以在那里有條件。
否則,與像您一樣在回圈中呼叫 append 相比,串列推導式是一種更有效的創建新串列的方法:
included_values = [i for i in range(1, x 1)
if i%2 !=0 or i%5 != 0]
我在https://replit.com/@ToniAlatalo/DapperSeagreenMacro#main.py做了這個改變
還有另一個我認為你可以從:
for i in range(1,len(included_values)):
到:
for value in included_values:
這可能會快一點,但可能沒有太大區別。
uj5u.com熱心網友回復:
如果只想排除 2 或 5 的倍數,可以嘗試使用串列理解 included_values = [k for k in range(1,x 1) if k%2!=0 and k%5!=0]
如果你想讓你的程式“更高效”,我建議只檢查 x 的平方根。 included_values = [k for k in range(1, math.ceil(math.sqrt(x)))]
但是,您的代碼效率不高。
x = int(input("Is your number prime?? Well... let's check! Type your number here:" ))
from math import sqrt, ceil
if x ==2:
print('Your number is a prime')
elif x < 2:
print("Your number isn't prime")
else:
print('Your number is not prime' if any([k for k in range(2,ceil(sqrt(x))) if x%k==0]) else 'Your number is a prime')
代碼分解:
x = int(input("Is your number prime?? Well... let's check! Type your number here:" )) 這將得到你的“x”,但如果 x 是預先確定的,你可以跳過這個。
from math import sqrt,ceil 這將從數學庫中匯入 sqrt 和 ceil
if x ==2:
print('Your number is a prime')
elif x < 2:
print("Your number isn't prime")
檢查數字是否小于 3,如果是 2,則列印數字是素數,否則列印它不是素數
print('Your number is not prime' if any([k for k in range(1,ceil(sqrt(x))) if x%k==0]) else 'Your number is a prime')檢查是否any([k for k in range(2,ceil(sqrt(x))) if x%k==0])為真,如果為真,則數字不是素數,但如果為假,則數字是素數(因為 x 不能被 2 到 x 的平方根范圍內的任何數字整除)。
當然,這并不完美,但對于正常使用來說已經足夠快了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/402087.html
