در این مقاله شما را با نحوهی نوشتن برنامه تشخیص عدد کامل در پایتون آشنا خواهیم کرد. عدد کامل یا 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 که عددی اول هم هست، به شکل زیر میباشد:
[caption id="attachment_74658" align="aligncenter" width="374"] برنامه تشخیص عدد کامل در پایتون[/caption]
2p − 1 عدد اول Mersenne نام دارد. عدد اول Mersenne یکی کمتر از مربعات عدد دو است. برای اینکه 2p − 1 اول باشد، لازم است که خود p عدد اولی باشد. به هر حال این یک شرط لازم ولی غیر کافی است. برای مثال p=11 عدد اول است، ولی 211 − 1 = 2047 = 23 × 89 عددی اول نیست. به هر حال مقادیر اعداد اول که در قانون Mersenne صدق کنند، نادر هستند. حال میخواهیم کدی به کمک زبان پایتون بنویسیم که عددی را از کاربر بخواند، اگر آن عدد اول بود و در شرط اعداد اول Mersenne نیز صدق میکرد، عدد کامل متناظر با آن را تولید کند.
الگوریتم کد ما به شرح زیر خواهد بود:
عدد ورودی تابع را در نظر بگیرید.
آیا عدد ورودی اول است؟
اگر نه: اگر نه، چاپ کن ورودی حاصل در قانون Mersonne صدق نمیکند. اگر بله: به مرحلهی بعد برو.
حاصل 2p − 1 را محاسبه کن:
اگر اول بود برو مرحلهی بعد. اگر نه، چاپ کن ورودی حاصل در قانون Mersonne صدق نمیکند.
حاصل 2p−1(2p − 1) را محاسبه کن.
مقدار را در خروجی به عنوان عدد کامل چاپ کن.
برای نوشتن کد الگوریتم بالا تابع 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
بیشتر بخوانید:برنامهی تشخیص عدد اول در پایتون - چگونه با پایتون برنامه بنویسیم؟ قسمت اول
جمعبندی: دنیای اعداد و رابطههای معنی دار میان آنها، ریاضیات را به علمی شیرین و کاربردی تبدیل کرده است. زبان برنامه نویسی پایتون نیز با قواعد دستوری ساده و در عین حال گسترده و قدرتمند خود امکان پیادهسازی بسیاری از قواعد ریاضی را فراهم کرده که منجر به انجام سریعتر محاسبات میشوند. از طرفی تلاش برای نوشتن الگوریتمها و معادلات ریاضی در تفهیم بهتر قواعد این زبان بسیار کمک کننده است. در این مقاله به پیادهسازی سریع و سادهی محاسبهی عدد کامل به طور گام به گام پرداختیم. همچنین یک الگوریتم برای تولید زوج آن ارائه نمودیم.
اگر به یادگیری بیشتر در زمینهی برنامه نویسی پایتون علاقه داری، یادگیری زبان پایتون بسیار ساده است. و با شرکت در دورهی آموزش پایتون توسعه وب در آینده میتونی اپلیکیشن موبایل و دسکتاپ بسازی و وارد حوزهی هوش مصنوعی هم شوی.
سلام اگه بخواهیم یه عدد از کاربر بگیریم و اعداد کامل کوچکتر اط اون عدد را در خروجی چاپ کنیم چطور نوشته میشه؟
نازنین کریمی مقدم۲۳ آبان ۱۴۰۲، ۲۰:۳۸
درود
شما هم میتونید از کامنت پایینی استفاده کنید و فط چون اعداد کامل رو میخواید، شرط بذارید که اگر اول نبود وارد چک کردن کامل بودنش بشه.
۲۰ آذر ۱۴۰۰، ۱۷:۲۱
عدد N را در نظر بگیرید، عددی k را مربع اولي عدد N گوییم به طوریکه اولا عدد k عددی اول باشد دوما عددN بر k2 تقسیم پذیر باشد. مثال : ۲ و ۵ دو مربع اولی عدد ۱۵۰۰ هستند چرا که هم ۲ و ۵ عدد اول هستند هم اینکه اعداد۴ و ۲۵ که مربع ۲ و ۵ هستند بر ۱۵۰۰ بخش پذیر هستند.
. برنامه ای بنویسید که از عدد ۱ تا صد هزار تمام اعدادی که دارای عامل مربع اولی هستند را محاسبه و عامل مربع اولی آنها را نیز چاپ کند.
امکانش هست برای بنده حل کنید . بنده حل کردم نمیدونم درسته یا نه . خواهش میکنم
نازنین کریمی مقدم۲۱ آذر ۱۴۰۰، ۰۶:۰۶
درود
البته ممکنه راههای بهتری داشته باشه اما یه راهش اینه که یک حلقه از 1 تا 100 هزار بگیرید و برای هر عدد:
- <a href="https://www.pythonpool.com/prime-factorization-python/" target="_blank" rel="noopener nofollow ugc">کد پیداکردن عاملهای اول یک عدد</a> رو بررسی کنید. نتیجه این کد را در یک آرایه بریزید.
- بعد یه حلقه رو این آرایه بزنید که عدد N رو بر مربع اینا تقسیم کنه و اگر باقی مانده صفر بود در آرایه نهایی بریزه. در آخر این آرایه نهایی جواب عامل مربع اولی اون عدد هست و میتونید درجا چاپش کنید.
امیر ارشیا۱۸ اسفند ۱۳۹۹، ۱۱:۳۵
توی کدهای آخرتون استرینگها قاطی شده
نازنین کریمی مقدم۲۱ اسفند ۱۳۹۹، ۱۷:۰۴
درود.
بله حق با شماست دابل کوتیشن اضافه شد تا مشکل رفع بشه اما انگار کلا در ویرایشگر فواصل هم به هم ریخته. حتما اصلاحش میکنیم.
ممنون از اطلاع رسانی تون :)
شروع رایگان یادگیری برنامه نویسی
کلیک کنید 👇
دوره الفبای برنامه نویسی با هدف انتخاب زبان برنامه نویسی مناسب برای شما و پاسخگویی به سوالات متداول در شروع یادگیری موقتا رایگان شد: