پاسخ : مجموع ارقام !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 !!!!!!!!