Un dépassement arithmétique se produit lorsqu'un calcul, comme une opération arithmétique ou une conversion de type, donne une valeur supérieure à la capacité du type qui la reçoit.
Les expressions de type int et long, ainsi que leurs équivalents non signés, s'enroulent silencieusement sur elles-mêmes dans ces circonstances.
Le comportement des calculs sur les entiers peut être modifié à l'aide du mot-clé checked. Lorsqu'un dépassement arithmétique se produit à l'intérieur d'un bloc checked, une instance de OverflowException est levée.
int one = 1;
checked
{
int expr = int.MaxValue + one; // OverflowException is thrown
}
// or
int expr2 = checked(int.MaxValue + one); // OverflowException is thrown
Les expressions de type float et double prennent une valeur spéciale, l'infini.
Les expressions de type decimal lèvent une instance de OverflowException.
Le pays d'Hyperia a ses problèmes. L'inflation n'y est plus maîtrisée, notamment. On t'a fait venir en avion pour prendre un poste à la banque centrale.
Pour simplifier l'administration en interne, la banque centrale a divisé chaque coupure en deux parties : une base, qui reste relativement inchangée, et un multiplicateur (le même pour toutes les coupures), que l'on peut modifier chaque année, chaque semaine, voire chaque jour.
Au moment de l'impression, la valeur des coupures sur les billets est le produit de la base et du multiplicateur.
À l'époque où ce système a été introduit, la coupure minimale valait déjà 10 000 000. Le tableau ci-dessous montre la situation (pour les 3 premières coupures) au moment de l'introduction du système. Les choses se sont bien dégradées depuis, et non seulement le multiplicateur change, mais la base aussi.
| Base | Multiplicateur | Coupure |
|---|---|---|
| 10 000 | 1 000 | 10 000 000 |
| 50 000 | 1 000 | 50 000 000 |
| 100 000 | 1 000 | 100 000 000 |
| ... | 1 000 | ... |
En résumé, cela signifie que coupure = base * multiplicateur.
Implémente la méthode CentralBank.DisplayDenomination(), qui prend la base et le multiplicateur et renvoie leur produit sous forme de string (base * multiplicateur). La string numérique renvoyée ne doit pas être formatée.
Si l'opération de multiplication provoque un débordement, la string "*** Too Big ***" doit être renvoyée.
CentralBank.DisplayDenomination(10000L, 1000L);
// => "10000000"
CentralBank.DisplayDenomination(long.MaxValue / 2, 10000L);
// => "*** Too Big ***"
En interne, la banque centrale utilise la même approche avec multiplicateur pour enregistrer le PIB. Les statistiques sont enregistrées dans une coupure de base, puis mises à l'échelle à l'aide du multiplicateur.
Implémente la méthode CentralBank.DisplayGDP(), qui prend le PIB de base et le multiplicateur actuel et renvoie le PIB sous forme de string.
Si le PIB ne peut pas être calculé, "*** Too Big ***" est renvoyé.
CentralBank.DisplayGDP(555f, 10000f);
// => "5550000"
CentralBank.DisplayGDP(float.MaxValue / 2, 10000f);
// => "*** Too Big ***"
Ton patron à la banque veut s'assurer qu'il n'y aura aucun problème au moment de la paie.
Implémente la méthode CentralBank.DisplayChiefEconomistSalary(), qui prend un salaire exprimé en unités de base (comme ci-dessus) et un multiplicateur, et renvoie une string contenant le produit.
Si le salaire ne peut pas être calculé, "*** Much Too Big ***" est renvoyé.
CentralBank.DisplayChiefEconomistSalary(555000m, 10000m);
// => "5550000000"
CentralBank.DisplayChiefEconomistSalary(555000m, decimal.MaxValue / 2L);
// => "*** Much Too Big ***"
Inscris-toi sur Exercism pour apprendre et maîtriser C# avec 62 concepts178 exercices, et un vrai mentorat humain, le tout gratuitement.