سر و کله‌زدن با ارقام بزرگ

بازی بزرگان

یکی از مسایلی که بیشتر برنامه‌نویسان، دیر یا زود با آن روبه‌رو می‌شوند، ذخیره‌سازی و محاسبه اعداد و ارقام بزرگ است. همان‌طور که می‌دانیم، ظرف ذخیره‌سازی داده‌ها متناسب با حجم و میزان بزرگی ارزش داده، رشد می‌کند. به‌طور مثال، در زبان C بزرگ‌ترین حافظه‌ای که برای ذخیره‌سازی داده‌ها استفاده می‌شود، برابر با 8 بایت است که این مقدار در کامپایلر ANCI C به 10 بایت افزایش پیدا کرده است. اما زمانی پیش می‌آید که نیاز به ذخیره‌سازی و محاسبه اعداد بزرگ‌تر از 8 بایت داریم.
کد خبر: ۲۹۶۱۹۶

یکی از ساده‌ترین روش‌ها، ذخیره‌سازی ارقام اعداد در آرایه و انجام عملیات مورد نظر روی آرایه‌هاست. حالا بیایید ببینیم که چگونه 2عدد بزرگ را که در آرایه ذخیره شده‌اند با هم جمع کنیم.

ما اعداد را به‌صورت آرایه‌ای از کاراکترها از کاربر دریافت می‌کنیم. برای کم شدن فضای اشغال شده از کاراکتر استفاده می‌کنیم و با یک تبدیل ساده، خانه‌های آن را به رقم مورد نظر تبدیل می‌کنیم.

اعداد را به این صورت از کاربر دریافت می‌کنیم:

         char num1[1000],num2[1000];

         std::cout «« "Enter First Number : " «« std::endl;

         std::cin »» num1;

         std::cout «« "Enter Second Number : " «« std::endl;

         std::cin »» num2;

به این نکته توجه داشته‌باشید که این‌جا اعداد ما 1000رقمی هستند و میزان حافظه اشغالی برای آن‌ها با کوچک‌تر شدن‌شان تغییری نمی‌کند، ما می‌توانیم با تعریف اعداد به‌صورت اشاره‌گر برای آن‌ها حافظه داینامیک در نظر بگیریم و هر عدد بتواند هر تعداد رقمی را که خواست داشته‌باشد.

حالا باید 2عدد را جمع کنیم، این کار را تابعی با نام add انجام می‌دهد که به این‌صورت تعریف شده است:

این تابع ابتدا طول عدد بزرگ‌تر را پیدا می‌کند، سپس اعداد را بر عکس می‌کند؛ اما چرا برعکس؟

کاربر عدد 12 را وارد کرده است. این عدد به این‌صورت در آرایه قرار گرفته است:

4خانه باقی‌مانده بلااستفاده هستند. ما توسط تابع reverse خانه‌های آرایه را جابه‌جا می‌کنیم و سپس به اندازه اختلاف طول 2عدد با طول بیشتر یا همان len در کد بالا صفر اضافه می‌کنیم. این‌کار را برای این انجام می‌دهیم که اگر طول 2عدد متفاوت بود، بتوان 2عدد را با هم جمع کرد (البته بدون اضافه کردن صفر هم می‌توانیم این کار را انجام دهیم، ولی این‌کار جمع کردن را ساده‌تر می‌کند). بعد از این مرحله، در حلقه for تک‌تک ارقام را با هم جمع می‌کنیم. مقدار متغییر carry مقدار رقم نقلی از جمع 2عدد حاصل است. مثلا اگر 2 با 9 جمع شود، مقدار carry برابر یک است که مقدار آن در جمع 2رقم بعدی استفاده شود. در نهایت، حاصل جمع 2عدد در آرایه num1 قرار می‌گیرد و سپس باید num1 نیز بر عکس شود تا حاصل، نتیجه دلخواه ما باشد. این روش، تنها یکی از روش‌های جمع 2 عدد بزرگ است و مفهوم جمع کاغذی را پیاده می‌کند. بدیهی است روش‌های بهینه‌تر و با مصرف ‌کمتر حافظه وجود دارند که در صورت امکان، در آینده آن‌ها را توضیح خواهیم داد. کد این برنامه نیز از طریق لینک زیر قابل دریافت است:

http://tinyurl.com/clickprog261

newsQrCode
ارسال نظرات در انتظار بررسی: ۰ انتشار یافته: ۰

نیازمندی ها