Арифметичне переповнення виникає тоді, коли обчислення, як-от арифметична операція чи перетворення типу, дає значення, більше за місткість типу, що приймає це значення.
За таких обставин вирази типу 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.
У Гіперії є свої проблеми. Зокрема, інфляція вийшла з-під контролю. Нас запросили сюди працювати за контрактом у центральному банку.
Щоб спростити внутрішнє адміністрування, центральний банк розділив кожен номінал на частини: базу, яка залишається відносно незмінною, і множник (однаковий для всіх номіналів), який можна змінювати щороку, щотижня або навіть щодня.
Коли банкноти друкують, номінал на них є добутком бази і множника.
На момент запровадження цієї системи мінімальна банкнота вже мала номінал 10 000 000. Таблиця нижче показує становище (для перших 3 номіналів), коли систему тільки-но запровадили. Відтоді все стало набагато гірше, і змінюється не лише множник, а й база.
| База | Множник | Номінал |
|---|---|---|
| 10 000 | 1 000 | 10 000 000 |
| 50 000 | 1 000 | 50 000 000 |
| 100 000 | 1 000 | 100 000 000 |
| ... | 1 000 | ... |
Підсумовуючи, це означає, що номінал = база * множник.
Реалізуйте метод CentralBank.DisplayDenomination(), який приймає базу і множник та повертає рядок тексту (англ. string) з їхнім добутком (база * множник). Повернутий числовий рядок тексту не потрібно форматувати.
Якщо множення спричиняє переповнення, потрібно повернути рядок тексту "*** 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 ***"
Зареєструйтеся на Exercism, щоб вивчати й опановувати C#, а також 62 концепції178 вправ та справжнє наставництво від людей, і все це безкоштовно.