یک مسئلهٔ واقعی، از «کار میکند» تا «خوب کار میکند»
عدد اول عددی بزرگتر از ۱ است که فقط بر ۱ و خودش بخشپذیر باشد: ۲، ۳، ۵، ۷، ۱۱، … برای تشخیصش کافی است همهٔ اعداد ۲ تا n-1 را امتحان کنیم و ببینیم کدام n را میشمارند:
n = int(input())
divisors = 0
for i in range(2, n):
if n % i == 0:
divisors += 1
if divisors == 0:
print("اول است")
else:
print("اول نیست")
درست کار میکند، ولی بیدلیل زیاد کار میکند: به محض پیدا شدن اولین مقسومعلیه، جواب معلوم است. با یک متغیر بولی (پرچم) و break، بهمحض معلوم شدن جواب از حلقه بیرون میآییم:
is_prime = True
for i in range(2, n):
if n % i == 0:
is_prime = False
break
و یک نکته که در گام آخر دیدی: همیشه با ورودیهای مرزی تست کن (۰، ۱، منفی، خیلی بزرگ). نسخههای ساده برای n = 1 جواب غلط میدهند، چون حلقه اصلاً اجرا نمیشود.
در درس تمرین حلقه همین مسئله با چهار نسخه حل شده؛ نسخهٔ آخر فقط تا جذر n میگردد و برای اعداد بزرگ هزار برابر سریعتر است.