«سرریز محاسباتی» زمانی رخ میدهد که نتیجهی یک محاسبه، مانند یک عملیات حسابی یا یک تبدیل نوع، مقداری بزرگتر از ظرفیت نوع دریافتکننده باشد.
عبارتهایی از نوع int و long و معادلهای بدون علامتشان در چنین شرایطی بیصدا دور میزنند.
رفتار محاسبات روی اعداد صحیح را میتوان با استفاده از کلیدواژهی checked تغییر داد. وقتی درون یک بلوک checked سرریزی رخ دهد، نمونهای از OverflowException پرتاب میشود.
int one = 1;
checked
{
int expr = int.MaxValue + one; // OverflowException is thrown
}
// or
int expr2 = checked(int.MaxValue + one); // OverflowException is thrown
عبارتهایی از نوع float و double مقدار خاص بینهایت را میگیرند.
عبارتهایی از نوع decimal نمونهای از OverflowException را پرتاب میکنند.
کشور هایپریا مشکلات خاص خود را دارد. بهویژه اینکه تورم از کنترل خارج شده است. شما را به بانک مرکزی آوردهاند تا قراردادی را بر عهده بگیرید.
بانک مرکزی برای سادهتر کردن امور اداری داخلی، هر ارزش اسمی را به بخشهایی تقسیم کرده است: یک پایه که نسبتاً بدون تغییر میماند و یک ضریب (یکسان برای همهی ارزشهای اسمی) که میتواند سالانه یا هفتگی یا حتی روزانه تغییر کند.
ارزش اسمیای که هنگام چاپ روی اسکناسها میآید، حاصلضرب پایه در ضریب است.
تا زمانی که این سیستم معرفی شد، کمترین ارزش اسمی اسکناسها هم ۱۰٬۰۰۰٬۰۰۰ بود. جدول زیر وضعیت را (برای ۳ ارزش اسمی اول) در زمان معرفی سیستم نشان میدهد. از آن زمان اوضاع بسیار بدتر شده است و نهتنها ضریب تغییر میکند، بلکه پایه هم تغییر میکند.
| پایه | ضریب | ارزش اسمی |
|---|---|---|
| ۱۰٬۰۰۰ | ۱٬۰۰۰ | ۱۰٬۰۰۰٬۰۰۰ |
| ۵۰٬۰۰۰ | ۱٬۰۰۰ | ۵۰٬۰۰۰٬۰۰۰ |
| ۱۰۰٬۰۰۰ | ۱٬۰۰۰ | ۱۰۰٬۰۰۰٬۰۰۰ |
| ... | ۱٬۰۰۰ | ... |
بهطور خلاصه، این یعنی ارزش اسمی = پایه * ضریب.
لطفاً متد CentralBank.DisplayDenomination() را پیادهسازی کنید که پایه و ضریب را میگیرد و رشتهای از حاصلضرب آنها (پایه * ضریب) را برمیگرداند. رشتهی عددی برگرداندهشده نباید قالببندی شود.
اگر عمل ضرب باعث سرریز شود، باید رشتهی "*** Too Big ***" برگردانده شود.
CentralBank.DisplayDenomination(10000L, 1000L);
// => "10000000"
CentralBank.DisplayDenomination(long.MaxValue / 2, 10000L);
// => "*** Too Big ***"
بانک مرکزی برای ثبت تولید ناخالص داخلی در داخل هم از همان روش ضریب استفاده میکند. آمارها با یک ارزش اسمی پایه ثبت میشوند و سپس با ضریب بزرگ میشوند.
لطفاً متد CentralBank.DisplayGDP() را پیادهسازی کنید که تولید ناخالص داخلی پایه و ضریب فعلی را میگیرد و تولید ناخالص داخلی را بهصورت رشته برمیگرداند.
اگر تولید ناخالص داخلی محاسبهشدنی نباشد، "*** Too Big ***" برگردانده میشود.
CentralBank.DisplayGDP(555f, 10000f);
// => "5550000"
CentralBank.DisplayGDP(float.MaxValue / 2, 10000f);
// => "*** Too Big ***"
رئیس شما در بانک میخواهد مطمئن شود که هنگام پرداخت حقوق مشکلی پیش نمیآید.
متد CentralBank.DisplayChiefEconomistSalary() را پیادهسازی کنید که حقوقی را که بر حسب واحدهای پایه بیان شده است (مانند بالا) و یک ضریب میگیرد و رشتهای حاوی حاصلضرب برمیگرداند.
اگر حقوق محاسبهشدنی نباشد، "*** Much Too Big ***" برگردانده میشود.
CentralBank.DisplayChiefEconomistSalary(555000m, 10000m);
// => "5550000000"
CentralBank.DisplayChiefEconomistSalary(555000m, decimal.MaxValue / 2L);
// => "*** Much Too Big ***"