3 回答

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超6個贊
ok,我們分兩點(diǎn)來說:
1、你的算法邏輯上有問題。
for t in range(2,int(math.sqrt(i))+1):
if i % t == 0:
break
else:
print(i)
你這段代碼的目的是為了判斷是否存在除1和本身外的其他約數(shù)。但是一旦i不能被t整除你就打印,這就錯了,應(yīng)該是整個for循環(huán)結(jié)束仍不存在其他約數(shù)才打印,比如99不能被2整除,在你這里就打印了,顯然是錯的。所以正確的做法是判斷循環(huán)是否完成。怎么判斷呢,一種是進(jìn)行計(jì)數(shù)與int(math.sqrt(i))+1比較或者非正常結(jié)束打標(biāo)記,但是python有更好的方法。這就要說到第二點(diǎn)。
2、for……else語法,當(dāng)for正常結(jié)束時執(zhí)行else語句。這就是為什么你把else拿到外面一層結(jié)果正確的原因。

TA貢獻(xiàn)1854條經(jīng)驗(yàn) 獲得超8個贊
Python for的語法,執(zhí)行完循環(huán)條件之后,會進(jìn)入else分支執(zhí)行。
for i in range(3):
print(i)
else:
print(i)
結(jié)果:
0
1
2
2

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個贊
當(dāng)i=51時,內(nèi)層循環(huán):
t=2, 不能整除,你print(i)
t=3, 可以整除,你break
......
實(shí)際上,51不是素?cái)?shù),你只判斷了一次不能被2整除,就print了。正確的做法是:2-8 都不能整除才print。
添加回答
舉報(bào)