1. امیر علی
  2. برنامه‌نویسی و طراحی وب
  3. یکشنبه, 24 اسفند 1393
سلام

امروز به یک سوال سبتا آسان برنامه نویسی C++ برخورد کردم. سوال به شرح زیر بود :
برنامه ای بنویسید که دو عدد طبیعی حداکثر 50 رقمی را از ورودی گرفته و آنها را با یکدیگر
جمع کرده و نتیجه را چاپ کند. (با استفاده ا ز آرایه حل شود)
گویا منظور این بوده است که هر رقم از عدد را در حداکثر 50 خانه قرار دهیم و سپس خانه های دو آرایه را با هم جمع کنیم.
برنامه ای که برای این سوال نوشتم به شرح زیر می باشد :
#include <cstdlib>
#include <iostream>
using namespace std;
long long first;
long long second;
int f[50];
int s[50];
int p[51];
int i=50;
int main(int argc, char *argv[])
{
cin>>first;
cout<<endl;
cin>>second;
cout<<endl;
while(first!=0)
{
f[i]=first%10;
first=first-f[i];
first=first/10;
i=i-1;
}
i=50;
while(second!=0)
{
s[i]=second%10;
second=second-s[i];
second=second/10;
i=i-1;
}
for(i=50;i<=0;i--)
if(f[i]+s[i]+p[i]>=10)
{
p[i]=p[i]+f[i]+s[i]-10;
p[i-1]=1;
}
else
{
p[i]=p[i]+f[i]+s[i];
}

for(i=0;i<=50;i++)
cout<<p[i];
cout<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}

به نظرم از نظر الگوریتمی برنامه درست می باشد اما جواب لازم را به دست نمی آورم. در اعداد با تعداد ارقام کم نتیجه چندین صفر می باشد و در اعداد با تعداد ارقام زیاد عدد دوم دریافت نمی شود.
با تشکر ممنون می شوم اگر پاسخی به من بدهید.
چه کار کنم که مشکلم برطرف شوم؟
بهترین پاسخ
hani بهترین پاسخ Pending Moderation
4
رای
پس‌گیری
سلام
توی خط ۳۱ از کدتون ، حلقه به هیچ وجه اجرا نمیشه چون شرط رو درست بکار نبردید، این رو جایگزینش کنید
for(i=50;i>=0;i--)

بقیش که ظاهرا درست میومد
http://8pic.ir/images/cey8vb6aw7055ns560f0.gif http://8pic.ir/images/gfwfnoz9vjfa5hrx260e.gif http://8pic.ir/images/5owjmdso9cy5avg3nsfb.gif http://8pic.ir/images/20gdy2z8wd2gzb25tqou.gif http://8pic.ir/images/53361nr7xhimv8xjqi1s.gif
امیر علی بهترین پاسخ Pending Moderation
2
رای
پس‌گیری
hani wrote:

سلام
توی خط ۳۱ از کدتون ، حلقه به هیچ وجه اجرا نمیشه چون شرط رو درست بکار نبردید، این رو جایگزینش کنید
for(i=50;i>=0;i--)

بقیش که ظاهرا درست میومد


بسیار متشکر. مشکل همین بود. فقط یه سوال برای اینکه بتوانم یه عدد 50 رقمی وارد کنم باید چی کار کنم؟ چه نوع متغییری استفاده کنم آخر وقتی عددی مثلا 49 رقمی وارد می کنم فقط 0 چاپ می شود و حتی عدد دوم هم دریافت نمیشود ممنون میشوم اگر راهنمایی کنید (برنامه فقط تا اعداد 19 رقمی را قبول میکند. اکر عدد 20 رقمی به دهم عدد دوم را درخواست نمیکند)
hani بهترین پاسخ Pending Moderation
2
رای
پس‌گیری
نمیشه خوب ، شما باید به اینتل سفارش بدی برات یه cpu که 128 بیتی بسازن:D
الان cpu ّها حداکثر 64 بیتی هستن که ماکزیمم عدد صحیحی که میتونن نشون بدن 9,223,372,036,854,775,807 هستش، تازه اگه بیت علامت رو درنظر نگیرین وگرنه که نصف این عدد هست

اینه که وقتی شما عددی بزنید که بزرگتر از 9,223,372,036,854,775,807 باشه cpu سرریز میکنه و برمیگرده از اول ، مثل کنتور برق خونه ، نمیدونم کنتور برق رو دیدید چجوری کارمیکنه؟ مثلا اگه سه رقمی باشه بعد 999 میشه 000 نمیشه 1000:D چون کنتور سه رقمیه
اینجا هم همین قضیه صادقه ، وقتی cpu شما 64 بیتی هست نمیتونید عدد بزرگتر بهش بدی

چیزی که به ذهنم میرسه اینه که به جای اعداد صحیح از ممیز شناور(اعشاری) استفاده کنید ، مثلا long double

موفق باشید
http://8pic.ir/images/cey8vb6aw7055ns560f0.gif http://8pic.ir/images/gfwfnoz9vjfa5hrx260e.gif http://8pic.ir/images/5owjmdso9cy5avg3nsfb.gif http://8pic.ir/images/20gdy2z8wd2gzb25tqou.gif http://8pic.ir/images/53361nr7xhimv8xjqi1s.gif
امیر علی بهترین پاسخ Pending Moderation
0
رای
پس‌گیری
hani wrote:

نمیشه خوب ، شما باید به اینتل سفارش بدی برات یه cpu که 128 بیتی بسازن:D
الان cpu ّها حداکثر 64 بیتی هستن که ماکزیمم عدد صحیحی که میتونن نشون بدن 9,223,372,036,854,775,807 هستش، تازه اگه بیت علامت رو درنظر نگیرین وگرنه که نصف این عدد هست

اینه که وقتی شما عددی بزنید که بزرگتر از 9,223,372,036,854,775,807 باشه cpu سرریز میکنه و برمیگرده از اول ، مثل کنتور برق خونه ، نمیدونم کنتور برق رو دیدید چجوری کارمیکنه؟ مثلا اگه سه رقمی باشه بعد 999 میشه 000 نمیشه 1000:D چون کنتور سه رقمیه
اینجا هم همین قضیه صادقه ، وقتی cpu شما 64 بیتی هست نمیتونید عدد بزرگتر بهش بدی

چیزی که به ذهنم میرسه اینه که به جای اعداد صحیح از ممیز شناور(اعشاری) استفاده کنید ، مثلا long double

موفق باشید

پیشنهاد خوبیه. ممنون
  • صفحه :
  • 1


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