برنامه تشخیص عدد کامل در پایتون

دسته بندی: پایتون
زمان مطالعه: 6 دقیقه
۱۰ شهریور ۱۳۹۹

در این مقاله شما را با نحوه‌ی نوشتن برنامه تشخیص عدد کامل در پایتون آشنا خواهیم کرد. عدد کامل یا Perfect Number مفهوم بسیار ساده‌ای دارد. بهتر است در صورت لزوم برای درک بهتر قواعد پایتون به کار گرفته شده در این مقاله، مقاله‌های ارائه شده در خصوص آموزش مقدماتی زبان پایتون و مباحث مرتبط با حلقه‌های تکرار و قواعد شرطی را مطالعه کنید. اگر به برنامه‌نویسی و چالش حل مسئله علاقه‌مند هستید، تا پایان مقاله‌، با ما همراه باشید.

فهرست محتوای این مقاله

عدد کامل چیست

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

عدد 6 را در نظر بگیرید. مقسوم علیه‌های 6 برابر اعداد 1، 2، 3 و 6 است. طبق تعریف عدد کامل، 6 عدد کاملی است؛ زیرا: 6=(1+2+3+6)*2/1 است و یا 6=1+2+3. عدد 12 عدد کاملی نیست چون مقسوم علیه‌های 12  به جز خودش عبارتند از {6، 4، 3، 2، 1} و از طرفی 6+4+3+2+1 برابر عدد 12 نیست.

حال که با مفهوم عدد کامل آشنا شدید به ارائه‌ی الگوریتم برنامه می‌پردازیم.

الگوریتم برنامه تشخیص عدد کامل در پایتون

تعیین این که عددی کامل است یا نه، بسیار ساده است. طبق تعریفی که از عدد کامل در بخش قبل ارائه شد، برای نوشتن کد آن توسط پایتون الگوریتم زیر را تعریف می‌کنیم:

  • عدد را از ورودی بگیرید.
  • مقسوم علیه‌های مثبت کوچکتر از آن عدد را مشخص کنید.
  • حاصل جمع مقسوم علیه‌های مثبت کوچک‌تر از خود عدد را محاسبه کنید.
  • اگر نتیجه‌ی مرحله‌ی قبل برابر خود عدد بود، آن عدد کامل است؛ در غیر این‌صورت کامل نیست.

نوشتن برنامه تشخیص عدد کامل در پایتون

با توجه به الگوریتم تعریف شده در مرحله‌ی قبل، ابتدا با دستور input ورودی را از کاربر می‌گیریم. چون که دستور input، ورودی را به شکل رشته (str) از کاربر می‌خواند، آن را با دستور int به عدد صحیح تبدیل می‌کنیم.

number=input("Enter Your Number:")
number=int(number)

برای تعیین مقسوم‌علیه‌های مثبت و کوچک‌تر از خود عدد، به راحتی با دستور حلقه‌ی for اعداد در بازه‌ی یک تا یکی کم‌تر از خود عدد را از نظر بخش‌پذیری بر عدد ورودی کاربر، بررسی می‌کنیم. همچنین با یک دستور جمع ساده اعدادی را که جزو مقسوم‌علیه‌ها هستند و عدد ورودی بر آن‌ها بخش‌پذیر است را با هم جمع می‌کنیم و در متغیر result قرار می‌دهیم. به کد زیر توجه کنید:


number=int(input("Enter Your Number:"))

result=0
for item in range(1,number):
	if number%item==0:
    	result+=item

در پایان مقدار result را با عدد ورودی مقایسه می‌کنیم. اگر برابر بود عدد کامل است و اگر نه، کامل نیست.

if (result==number):
	print("It is a perfect number.")
else:
	print("It is not a perfect number.")

می‌توانیم کد بالا را به شکل تابع تعریف کنیم:

def perfect_number(n):
    sum = 0
    for x in range(1, n):
        if n % x == 0:
            sum += x
    return sum == n

تابع بالا در صورتی که عدد ورودی کامل باشد مقدار منطقی True را برمی‌گرداند.

اعداد کامل زوج

اقلیدس ثابت کرد که 2p−1(2p − 1) عدد کامل زوج است هر زمان که 2p − 1 عدد اول باشد. برای مثال چهار عدد کامل تولید شده توسط این فرمول، با مقدار p که عددی اول هم هست، به شکل زیر می‌باشد:

برنامه تشخیص عدد کامل در پایتون

برنامه تشخیص عدد کامل در پایتون

2p − 1 عدد اول Mersenne نام دارد. عدد اول Mersenne یکی کم‌تر از مربعات عدد دو است. برای اینکه 2p − 1  اول باشد، لازم است که خود p عدد اولی باشد. به هر حال این یک شرط لازم ولی غیر کافی است. برای مثال p=11 عدد اول است، ولی 211 − 1 = 2047 = 23 × 89 عددی اول نیست. به هر حال مقادیر اعداد اول که در قانون Mersenne صدق کنند، نادر هستند. حال می‌خواهیم کدی به کمک زبان پایتون بنویسیم که عددی را از کاربر بخواند، اگر آن عدد اول بود و در شرط اعداد اول Mersenne نیز صدق می‌کرد، عدد کامل متناظر با آن را تولید کند.

الگوریتم کد ما به شرح زیر خواهد بود:

  1. عدد ورودی تابع را در نظر بگیرید.
  2. آیا عدد ورودی اول است؟

اگر نه: اگر نه، چاپ کن ورودی حاصل در قانون Mersonne صدق نمی‌کند.

اگر بله: به مرحله‌ی بعد برو.

  1. حاصل 2p − 1 را محاسبه کن:

اگر اول بود برو مرحله‌ی بعد.

اگر نه، چاپ کن ورودی حاصل در قانون Mersonne صدق نمی‌کند.

  1. حاصل 2p−1(2p − 1) را محاسبه کن.
  2. مقدار را در خروجی به عنوان عدد کامل چاپ کن.

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

def even_perfect_number(p):
	def IsPrime(n):
    	if n==2 or n==3:
        	return True
        a=(n//2)+1
        for i in range(2,a):
        	if n%i==0:
            	return False
        return True
        
#---------------------------
	if IsPrime(p)==False:
    	print("it is not satisfies Mersonne law's')
        return
    else:
    	k=2**p-1
        if IsPrime(k)==False:
        	print("it is not satisfies Mersonne law's')
        	return
		else:
        	result=2**(p-1)*k
            return result

جمع‌بندی:

دنیای اعداد و رابطه‌های معنی دار میان آن‌ها، ریاضیات را به علمی شیرین و کاربردی تبدیل کرده است. زبان برنامه ‌نویسی پایتون نیز با قواعد دستوری ساده و در عین حال گسترده و قدرتمند خود امکان پیاده‌سازی بسیاری از قواعد ریاضی را فراهم کرده که منجر به انجام سریع‌تر محاسبات می‌شوند. از طرفی تلاش برای نوشتن الگوریتم‌ها و معادلات ریاضی در تفهیم بهتر قواعد این زبان بسیار کمک کننده است. در این مقاله به پیاده‌سازی سریع و ساده‌ی محاسبه‌ی عدد کامل به طور گام به گام پرداختیم. همچنین یک الگوریتم برای تولید زوج آن ارائه نمودیم.

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

چه امتیازی به این مقاله می دید؟
نویسنده المیرا ناصح

نظرات کاربران

اولین دیدگاه این پست رو تو بنویس !

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :