تشخیص عدد اول در پایتون

متوسطحلقه

صورت سؤال

برنامه‌ای بنویسید که عدد صحیح n را از ورودی بخواند. اگر n اول بود «اول است» و در غیر این صورت «اول نیست» را چاپ کند.

ورودی عددی صحیح و نامنفی است. دقت کنید که ۰ و ۱ اول نیستند و ۲ کوچک‌ترین عدد اول است.

ورودی نمونه

29

خروجی نمونه

اول است

خودتان امتحان کنید

کد را در ویرایشگر زیر کامل کنید و اجرا کنید. ورودی نمونه در کادر ورودی آماده است و بعد از هر اجرا، خروجی شما با خروجی نمونه مقایسه می‌شود.

Ctrl + Enter
خروجی

کد را اجرا کنید تا خروجی آن اینجا نمایش داده شود.

راهنمایی

فرض کنید عدد اول است و مقسوم‌علیه‌ها را از ۲ تا جذر n امتحان کنید. اگر یکی از آن‌ها عدد را بدون باقی‌مانده تقسیم کرد، فرضتان غلط بوده است.

جواب و توضیح

بهتر است جواب را بعد از امتحان کردن راه خودتان باز کنید.

نمایش جواب
n = int(input())

is_prime = n >= 2
for d in range(2, int(n ** 0.5) + 1):
    if n % d == 0:
        is_prime = False
        break

if is_prime:
    print("اول است")
else:
    print("اول نیست")

این جواب چطور کار می‌کند؟

متغیر is_prime از اول با n >= 2 مقدار می‌گیرد. همین یک سطر حالت‌های ۰ و ۱ را کنار می‌گذارد، چون برای آن‌ها مقدار اولیه False است و حلقه هم چیزی را عوض نمی‌کند.

اگر n بر عددی بزرگ‌تر از جذرش بخش‌پذیر باشد، خارج‌قسمت آن تقسیم از جذر کوچک‌تر است و حلقه آن را زودتر پیدا کرده است. به همین دلیل امتحان تا int(n ** 0.5) کافی است و برای عددهای بزرگ برنامه را خیلی سریع‌تر می‌کند.

شرط n % d == 0 یعنی تقسیم باقی‌مانده ندارد. با پیدا شدن اولین مقسوم‌علیه، break حلقه را تمام می‌کند، چون جواب دیگر عوض نمی‌شود. برای ۲ و ۳ بازهٔ حلقه خالی است و جواب همان مقدار اولیه می‌ماند.

راه دوم: ساختار for-else

n = int(input())

if n < 2:
    print("اول نیست")
else:
    for d in range(2, int(n ** 0.5) + 1):
        if n % d == 0:
            print("اول نیست")
            break
    else:
        print("اول است")

بخش else یک حلقهٔ for فقط وقتی اجرا می‌شود که حلقه بدون break تمام شده باشد. این ساختار مخصوص پایتون است و متغیر پرچم را لازم نمی‌کند. برای عددهای خیلی بزرگ، math.isqrt(n) جذر صحیح را دقیق‌تر از n ** 0.5 می‌دهد.

اشتباه‌های رایج

  • ۱ را اول حساب می‌کنند، چون حلقه برایش اجرا نمی‌شود و حالت آن جداگانه بررسی نشده است.
  • range(2, int(n ** 0.5)) می‌نویسند و خود جذر را امتحان نمی‌کنند؛ این‌طور عددی مثل ۹ یا ۲۵ اول تشخیص داده می‌شود.
  • جواب را داخل حلقه چاپ می‌کنند و برنامه برای یک عدد چند بار جواب می‌دهد.

تمرین بعدی

پایتون را قدم‌به‌قدم یاد بگیرید

این تمرین یکی از تمرین‌های پایتون با جواب دینا کد است. در دورهٔ پایتون از صفر هر مفهوم یک درس کوتاه دارد و تمرین هر درس با چند آزمون پنهان نمره می‌گیرد؛ درس‌های اول رایگان است. برای امتحان کد آزاد هم اجرای آنلاین پایتون در دسترس است.