PDA

View Full Version : تعیین عدد خوب یا بد (ریاضی)



alasht
شنبه 11 دی 1389, 14:20 عصر
سلام خدمت تمامی دوستان
برادر من تو درس مبانی یه مسئله برنامه نویسی داد تا براش برنامشو بنویسم اما چون ریاضیم خوب نیست گیر کردم توش :لبخند:

مسئله اینه :
تعریف : عدد N را عدد خوب گویند هرگاه مجموع مربعات ارقام آن محاسبه شده و برای عدد حاصل نیز عملیات مشابه تکرار شود تا حاصل عدد یک گردد
در غیر اینصورت عدد را عدد بد گویند
مثال : عدد 13 یک عدد خوب است13-----12+32 =10----12+02=1
سوال : با توجه به تعريف بالا الگوریتمی بنویسید که عددی طبیعی N را ازورودی بخواند تعیین کند که عددخوب است یا بد؟


من تا اینجا پیش رفتم اما فکر کنم مشکل داره









private void button1_Click(object sender, EventArgs e)
{
string s = textBox1.Text;
int[] arr = new int[20];
int sum = 0, tavan = 0;
char[] temp = s.ToCharArray();
for (int i = 0; i < s.Length; i++)
{
arr[i] = int.Parse(temp[i].ToString());
Convert.ToInt32(arr[i]);
listBox1.Items.Add(arr[i]);
while (sum != 1)
{
tavan = arr[i] * arr[i];
sum += tavan;
}
label2.Text = Convert.ToString(sum);
}


}




این برنامه عدد ورودی رو از textbox میگیره و ارقام اون رو از هم جدا میکنه و درون ارایه قرار میده و مقادیر را برای مشاهده کاربر درون listbox میریزه و مقادیر جدا شده را هر کدام را به توان دو میرسونه و با هم جمع میکنه تا اینجا رو فکر کنم درست نوشتم اما میخوام این عملیات اونقدر ادامه پیدا کنه که جواب 1 بشه با دستور while اینو نوشتم ولی فکر کنم اشتباهه چون هر عددی میدم 1 میشه اما بعضی اعداد این عملیات روش انجام نمیشه و جواب نباید 1 بشه



ممنون میشم از دوشتان که کمی راهنمایی کنن یا اگر راه حل ساده تری دارن با توجه به مسئله ارائه بدن
با تشکر

unknown.unforgiven
شنبه 11 دی 1389, 14:50 عصر
سلام
عدد خوب یا بد رو متوجه نشدم. اگه یه کم بیشتر توضیح بدی و 2 تا مثال بیشتر بزاری شاید بتونم کمکت کنم:چشمک:

alasht
شنبه 11 دی 1389, 15:20 عصر
والا من خودمم درست نفهمیدم
گفتم که ریاضیم خوب نیست :لبخند:
هر چی هست همون سواله بیشتر از اون نمیدونم

unknown.unforgiven
شنبه 11 دی 1389, 15:28 عصر
با توجه به اون چیزی که از عدد خوب یا بد فهمیدم این برنامه باید کار کنه (هر چه قدر جون کندم نتونستم یه کار کنم این کد عین بچه آدم دیده بشه:عصبانی++:)


string str = textBox1.Text;
int sum;
do
{
sum = 0;
for (int i = 0; i < str.Length; i++)
sum += ((str[i] - 48) * (str[i] - 48));
if (sum < 10)
break;
else
str = sum.ToString();
}
while (true);
if (sum == 1)
label1.Text = "True";
else
label1.Text = "False";

در ضمن فکر کنم برنامت مشکلات منطقی داشته باشه
پ.ن: بعد از اینکه پست میشه آدم میبینه عین بچه آدم داره کد رو نشون میده! :لبخند:

alasht
شنبه 11 دی 1389, 16:38 عصر
من چند از عدد 1 تا 100 تست کردم این اعداد true در اومد
1و7و13و19و23و28و31و32و44و49و68و70و79و 82و86و91و94و97و100
به نظر شما برنامه درسته یا نه
با تشکر

alasht
شنبه 11 دی 1389, 16:51 عصر
سلام
بعد از کلی تحقیق فهمیدم اون عدد خوب منظورش happy number هست
ممنون از دوستان که کمک کردن
مشکلم حل شد
اینم سایت ویکپدیا که در مورد عدد شاد توضیح داده
http://fa.wikipedia.org/wiki/%D8%B9%D8%AF%D8%AF_%D8%B4%D8%A7%D8%AF
با تشکر

unknown.unforgiven
شنبه 11 دی 1389, 16:54 عصر
من چند از عدد 1 تا 100 تست کردم این اعداد true در اومد
1و7و13و19و23و28و31و32و44و49و68و70و79و 82و86و91و94و97و100
به نظر شما برنامه درسته یا نه
با تشکر

با توجه اون چیزی که من از عدد خوب و بد فهمیدم، آره. درسته. با اجرای خط به خط برنامه رو دنبال کن ببین چه مقادیری تو برنامت داره تولید میشه. خیلی بهت کمک میکنه (مخصوصا واسه 7)

alasht
شنبه 11 دی 1389, 18:40 عصر
سلام مجدد
برنامتون کاملا درسته
اگه میشه الگوریتم کامل برنامه رو برام بنویسید ممنون میشم

مثلا به اینصورت

لیبل 1 : شروع
لیبل 2 : n را از ورودی بخوان
لیبل 3 : n را تقسیم بر 10 کن
لیبل 4 : اگر خارج قسمت برابر 0 بود برو به لیبل 5 در غیر اینصورت (n=خارج قسمت) برو به لیبل 3
........
تا اینجا که نوشتم مربوط میشه به جدا کردن ارقام
بقیشو شما زحمتشو بکشید ممنون میشم

unknown.unforgiven
شنبه 11 دی 1389, 18:52 عصر
سلام
خوش میگذره؟! این تیکش رو دیگه خودت بنویس. خدایی الگوریتم نویسی یادم رفته، وگرنه برات می نوشتم.

alasht
شنبه 11 دی 1389, 19:03 عصر
خوب شما درباره ی برنامتون توضیح بدین میشه الگوریتم
ممنون میشم توضیح بدین

sonixax
شنبه 11 دی 1389, 19:29 عصر
من توی C# تجربه ی زیادی ندارم و البته منظورتون رو هم درست از این اعداد خوب و بد شاد متوجه نشدم ، ولی آن چیزی که متوجه شدم این بود که مثلا اگر عدد 12 داریم باید 1 رو به توان دو برسونیم و 2 رو هم همین طور و بعد با هم جمع بزنیم ! یا اگر 7 داریم باید اول 7 رو به توان 2 رسوند و با حاصلش هم همین کار رو کرد تا برسیم به یکی از این اعداد :
0 و1, 4 , 16 , 20, 37 , 42 , 58 , 89 , 145 . اگر در نهایت به یک نرسیم یعنی عدد خوب نیست .
شما باید بعد از اینکه که تک تک ارقام ورودی رو به توان دو رسوندید و با هم جمع کردید عدد حاصل رو نگاه کنید اگر عدد مساوی یکی از این اعداد 0 و1, 4 , 16 , 20, 37 , 42 , 58 , 89 , 145 نبود یعنی هنوز باید دوباره این کار رو تکرار کنید و انقدر این کار رو ادامه بدید تا به یکی از اعدد 0 و1, 4 , 16 , 20, 37 , 42 , 58 , 89 , 145 برسید .
بهترین راه هم به نظر من هون While هست ، البته Do هم میتونه کار مشابهی انجام بده ، کافیه یک تابعی بنویسید که عدد ورودی رو میگیره و عملیات رو روش انجام میده ، اگر عدد مساوی یکی از این اعداد 0 و1, 4 , 16 , 20, 37 , 42 , 58 , 89 , 145 نبود مقدار True رو بر میگردونه و مقدار متغیر اولیه رو که عدد ورودی رو توش قرار دادید رو با عدد حاصل جایگزین میکنه و از اونجایی که با While این کار رو انجام دادید و خروجی متد شما True بوده و شرطی که در ابتدای حلقه وارد کردید هنوز پابرجاست این عمل با مقدار جدید دوباره تکرار میشه ، به محض اینکه نتیجه یکی از این 0 و1, 4 , 16 , 20, 37 , 42 , 58 , 89 , 145 اعداد شد مقدار رو در متغیر قبلی ذخیره میکنید و تابع شما مقدار False بر میگردونه و در نتیجه از حلقه خارج میشید و در خط بعد از حلقه عدد به دست آمده رو نشون میدید - حالا اگر عدد مساوی 1 بود یعنی عدد خوب و اگر نبود یعنی عدد بد .

البته فکر کنم تابع هم لازم نداشته باشه ، همون Do کارتون رو راه میندازه چون تغییر مقدار یک متغیر که خارج از یک تابع تعریف شده دنگ و فنگ داره ، اصلا این خودش یک تابع هست - سوتی دادم :لبخند:

unknown.unforgiven
شنبه 11 دی 1389, 19:34 عصر
string str = textBox1.Text;
تو این خط مقدار رشته textbox رو ریختم تو یه متغیر به اسم str
int sum;
متغیر sum واسه دونستن مقدار مجموع مربعات تک تک ارقام عدد
do
{
sum = 0;
چون تو هر مرحله میخوایم این عملیات رو تکرار کنیم تا به عدد 1 برسیم یه حلقه بینهایت میزارم و تو هر مرحله مقدار مجموع رو صفر میکنم (چون واسه هر عدد فرق میکنه)
for (int i = 0; i < str.Length; i++)
واسه اینکه بتونم مجموع مربعات ... رو حساب کنم محاسبات تک تکشون رو میندازیم تو یه حلقه for. حلقه تا جایی تکرار میشه که به انتهای رشته (یا همون عدد) برسه
sum += ((str[i] - 48) * (str[i] - 48));
تنها نکته این خط اون منهای 48ه. یه چیزی که باید حواست باشه اینه که تو رشته مقدار اسکی ذخیره میشه واسه همین اگه مثلا کاراکتر 0 توش باشه مقدار عددی که برمیگردونه 48ه. به خاطر همین منهای 48 میکنیم تا 48 تبدیل به صفر بشه. اگه از کلاس convert استفاده بکنی بازم همین مشکل پیش میاد
if (sum < 10)
برنامه آخر سر میخواد مجموع مربعات فلانش یا یک بشه یا نشه! اگه اینجا این شرط رو نذاریم برنامه تا ابد کار میکنه (چون تو حلقه بینهایت هستیم). شرط میگه وقتی مجموع کمتر از 10 (هر وقت مجموع اعدادت تک رقمی شد باید چک کنی 1 هست یا نه) شد از حلقه خارج شو.
break;
else
str = sum.ToString();
اینجا هم که در غیر این صورت شرطمونه. چون صورت سوال جوریه که تو مراحل بعدی با مجموع مربعات ... سر و کار داره باید همه این مراحل رو واسه sum (در صورتی که شرط برقرار نبود) دوباره تکرار بکنه. چون حلقه واسه کار با رشته نوشته شده باید متغیر عددی رو به رشته تبدیل بکنی. من از متود داخلیش استفاده کردم، وگرنه مشکلی نیست اگه با کلاس convert هم این کار رو بکنی
}
while (true);
شرط حلقه بینهایت (چون حلقه بینهایت میخواستم اینجا شرط رو true گذاشتم)
if (sum == 1)
label1.Text = "True";
else
label1.Text = "False";
این تیکه هم چک میکنه مجموع مربعات ... 1 هست یا نه. اگه بود عدد :متفکر: است (اسمش یادم رفت :لبخند:) اگرم نبود، خب نیست دیگه

راستی یه چیزی تو برنامه میلنگه! تو ویکی نوشته بود 0 هم جزو اون اعداد هست ولی 0 تو برنامه false میده. اول برنامه یه شرط بزار که اگه ورودی 0 بود خروجی true بده در غیر این صورت ادامه ماجرا. باز اگه جایی از برنامه برات گنگ بود بگو بیشتر توضیح بدم.
موفق باشی

sonixax
شنبه 11 دی 1389, 20:13 عصر
میگم این هم میشه :


int sum = 0;

do
{
// کد مربوط به محاسبه
}
while (sum != 0 || sum != 1 || sum != 4 || sum != 16 || sum != 20 || sum != 37 || sum != 42 || sum != 58 || sum != 89 || sum != 145);

if (sum == 1)
//عدد شاد است
else
//عدد شاد نیست

unknown.unforgiven
شنبه 11 دی 1389, 20:34 عصر
میگم این هم میشه :


int sum = 0;

do
{
// کد مربوط به محاسبه
}
while (sum == 0 || sum == 1 || sum == 4 || sum == 16 || sum == 20 || sum == 37 || sum == 42 || sum == 58 || sum == 89 || sum == 145);

if (sum == 1)
//عدد شاد است
else
//عدد شاد نیست

فکر کنم 3 تا مشکل پیش بیاد!
1. اگه sum=5 بشه چه اتفاقی میافته؟ تا ابد میمونه تو حلقه؟
2. فکر کنم شرط حلقه while باید به صورت =! تعریف بشه نه ==. چون حلقه while مادامی که شرط برقرار باشه اجرا میشه. (مثال نقض این حلقه عدد 13ه)
3. فرض کن sum=4 باشه. با فرض اینکه شرط حلقه درست باشه از حلقه در میاد ولی چون تو if تعریف نشده خروجی false میشه

sonixax
شنبه 11 دی 1389, 20:37 عصر
فکر کنم 3 تا مشکل پیش بیاد!
1. اگه sum=5 بشه چه اتفاقی میافته؟ تا ابد میمونه تو حلقه؟
2. فکر کنم شرط حلقه while باید به صورت =! تعریف بشه نه ==. چون حلقه while مادامی که شرط برقرار باشه اجرا میشه. (مثال نقض این حلقه عدد 13ه)
3. فرض کن sum=4 باشه. با فرض اینکه شرط حلقه درست باشه از حلقه در میاد ولی چون تو if تعریف نشده خروجی false میشه

درسته ، حواسم نبود باید != میذاشتم :لبخند:
الان درستش میکنم .
البته نمیدونم آیا با تمام اعداد صحیح حتما در نهایت به یکی از این اعداد میرسیم یا نه ! توی تعریف اومده که میرسیم .
در مورد عدد 4 هم خوب باید شرط فالس بشه چون عددی که حاصلش به 4 برسه شاد نیست . فقط اعدادی که حاصلشون به 1 میرسه اعداد شاد هستند .

unknown.unforgiven
شنبه 11 دی 1389, 20:50 عصر
به غیر از صفر همشون به 1 ختم میشن. فکر کنم اون اعداد اضافه فقط واسه اینه که runtime رو بهتر کنه. مثلاً خود 4 تیدیل میشه به 16، 16 به 37، 37 به 58 و ....

sonixax
یک شنبه 12 دی 1389, 03:39 صبح
به غیر از صفر همشون به 1 ختم میشن. فکر کنم اون اعداد اضافه فقط واسه اینه که runtime رو بهتر کنه. مثلاً خود 4 تیدیل میشه به 16، 16 به 37، 37 به 58 و ....

خوب مساله همینه ، من تعریفش رو خوندم قشنگ دوزاریم افتاد وقتی که هر عددی به یکی از اون 10 عدد برسه چرخه تمومه ، اگر قبل از رسیدن به یکی از اون اعداد به یک برسه عدد شاد هست - اگر نرسه عدد شاد نیست .