مجموع ارقام !1000

aboly

New Member
ارسال ها
266
لایک ها
110
امتیاز
0
#1
من تازه برنامه نویسی شروع کردم توی سایت project euler به مسأله مجموع ارقام !1000 برخوردم خیلی تعداد از سوال های دیگه اش هم این طوری هست مثلا مجموع ارقام 2 به توان 1000
حالا من یه کد به زور نوشتم برای سوال اول.ولی چون 1000! خیلی زیاد هست عدد را حتی نمی تونه چاپ کنه میشه ی کمکی بکنید.
 

Wight

New Member
ارسال ها
1,188
لایک ها
888
امتیاز
0
#2
پاسخ : مجموع ارقام !1000

سلام

یک راه اینه که هر رقم را درون یک خانه از آرایه 100000 تایی بریزی!
 

aboly

New Member
ارسال ها
266
لایک ها
110
امتیاز
0
#3
پاسخ : مجموع ارقام !1000

چه جوری؟ یه کم توضیح بده.
 

mnaderi1374

New Member
ارسال ها
15
لایک ها
15
امتیاز
0
#4
پاسخ : مجموع ارقام !1000

سلام ...
خوب شما از محدوده 18 رقم که میگذرید وارد محدوده ای به اصطلاح بیگ نام میشوید (اعداد بزرگ) ...
کامپیوتر برای این نمیتونه این اعداد بزرگ رو محاسبه کنه که باینری آنها از حتی 64 رقم نیز رد شده ولی سوال اینجاست ...
فرض کنید که به شما بگویند که یک عدد 200 رقمی را باید در یک عدد 200 رقمی دیگر ضرب کنید و اگر نه شما را میکشیم !!!! خوب طبیعتا شما به روش سنتی خودمان این 200 رقم را زیر هم می نویسید و شروع به ضرب کردن میکنید...
حالا جای شما کاری کنید که کامپیوتر این کارو انجام بده نه شما طبیعتا کامپیوتر در کسری از ثانیه این کارو میکنه ...
این سوالی که من گفتم ضرب بیگ نام در بیگ نام بود اما سوالی که شما میخواید ضرب بیگ نام در اینتیجر هست ....
خوب پیاده سازی این طبیعتا راحت تره . یکی از ایده هایی که برای این هست که اولین بار به ذهن میرسه اینه که بگی اول عددمون رو میریزیم تو یه آرایه بعد از اول شروع کنیم ضرب کردن ده بر یکشو بریزیم تو یه متغیر دیگه و بعد به ضرب بعدیمون اسفاده کنیم اما من یه ایده خفن تحت عنوان تابع ریلکس به شما معرفی میکنم که برید حالشو ببرید :دی !!!!

الگوریتم :

عدد مورد نظر رو به صورت دونه دونه در آرایه میریزیم ... مثلا برای ضرب عدد 516 در 3 این کار را میکنیم ....

هر سه عدد را فرض کنیم در آرایه a میریزیم پس به صورت زیر میشود:
a[999] = 6
a[998] = 1
a[997] = 5
حالا طبق الگوریتم عدد سه را در تک تک آرایه ها ضرب میکنیم که به صورت زیر میشود:
a[999] = 18
a[998] = 1
a[997] = 15
و حالا قسمت اصلی
سپس تابع ریلکس را صدا میزنیم
تابع ریلکس از آخرین خانه شروع میکند و به خانه بعدی برابر با تقسیم آن خانه به ده اضافه میکند و خودش را برابر با باقیمانده به ده میگذارد و همین کار را برای خانه های بعدی انجام میدهد.
به این صورت میشود که a[999] = 18 را برابر 8 و به خانه a[998] = 1 یک واحد اضافه میکند .
پس پس از صدا زدن تابع به صورت زیر خواهد شد :
a[999] = 8
a[998] = 2
a[997] = 5
a[996] = 1
همان طور که میبینیم الگوریتم درست کار کرده چون ضرب 516*3 = 1528 میشود !!!

have fun !!!!!!!!
 
بالا