3 回答

TA貢獻1821條經(jīng)驗 獲得超5個贊
一旦知道數(shù)字不是素數(shù),就需要停止迭代。break一旦找到質(zhì)數(shù)就添加一個,退出while循環(huán)。
只需對代碼進行最少的更改即可使其工作:
a=2
num=13
while num > a :
if num%a==0 & a!=num:
print('not prime')
break
i += 1
else: # loop not exited via break
print('prime')
您的算法等效于:
for a in range(a, num):
if a % num == 0:
print('not prime')
break
else: # loop not exited via break
print('prime')
如果將其放入函數(shù)中,則可以免除breakfor-else:
def is_prime(n):
for i in range(3, n):
if n % i == 0:
return False
return True
即使您要像這樣強力求素,也只需要迭代到的平方根即可n。另外,您可以跳過測試2之后的偶數(shù)。
這些建議如下:
import math
def is_prime(n):
if n % 2 == 0 and n > 2:
return False
for i in range(3, int(math.sqrt(n)) + 1, 2):
if n % i == 0:
return False
return True
請注意,此代碼不能正確處理0,1和負數(shù)。
通過all與生成器表達式一起使用來替換for循環(huán),我們使此過程更簡單。
import math
def is_prime(n):
if n % 2 == 0 and n > 2:
return False
return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))

TA貢獻1784條經(jīng)驗 獲得超7個贊
您的代碼存在兩個主要問題:
在指定一個非素數(shù)之后,即使您已經(jīng)知道它不是素數(shù),也要繼續(xù)檢查其余除數(shù),這可能導致它在打印“非素數(shù)”之后打印“素數(shù)”。提示:使用“ break”語句。
在檢查所有需要檢查的除數(shù)之前,請指定一個數(shù)字質(zhì)數(shù),因為您正在循環(huán)內(nèi)打印“質(zhì)數(shù)” 。因此,您會多次獲得“素數(shù)”,對于每個除數(shù)不均等地進入被測數(shù)的除數(shù)。提示:
else
僅在循環(huán)退出而不會中斷的情況下,才在循環(huán)中使用子句以顯示“素數(shù)”。
效率非常低下:
您應該跟蹤已經(jīng)找到的質(zhì)數(shù),并且只能除以這些數(shù)。如果已經(jīng)被2除,為什么要除以4?如果一個數(shù)字可被4整除,那么它也可被2整除,因此您早已將其捕獲,因此無需將其除以4。
您只需要測試被測試數(shù)的平方根,因為任何大于該因數(shù)的因數(shù)都需要乘以一個小于該因數(shù)的數(shù),并且在您獲得更大的因數(shù)時就已經(jīng)進行了測試。
添加回答
舉報