Задача Mif 18.
Условие
Введите из стандартного потока целое число и выведите его словами на английском языке.
Тесты
Входные данные | Выходные данные |
0 | zero |
-7284 | minus seven thousand two hundred and eighty-four |
900000000000000010 | nine hundred billiard ten |
4561230057773 | four billion five hundred and sixty-one milliard two hundred and thirty million fifty-seven thousand seven hundred and seventy-three |
599999990999999900 | five hundred and ninety-nine billiard nine hundred and ninety-nine billion nine hundred and ninety milliard nine hundred and ninety-nine million nine hundred and ninety-nine thousand nine hundred |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
#include <iostream> #include <cmath> using namespace std; void number (long long n) { if(abs(n) < 1000){// сотни, десятки, единицы if(n < 0) { cout << "minus "; n = abs(n); number(n); } else if(n == 0) cout << "zero"; else {// натуральные числа int safe = n;// сохраняем значение числа, так как дальше его изменяем, if((n / 100) != 0) {// если есть сотни n = n / 100; } switch(n){ case 1: cout << "one "; break; case 2: cout << "two "; break; case 3: cout << "three "; break; case 4: cout << "four "; break; case 5: cout << "five "; break; case 6: cout << "six "; break; case 7: cout << "seven "; break; case 8: cout << "eight "; break; case 9: cout << "nine "; break; } if(((safe / 100) == 0) && ((safe % 100) / 10 == 0)){ n = -1e90;// чтобы не продолжать выводить нули } if((safe / 100) > 0) { cout << "hundred "; n = safe % 100; safe = 0; if(n > 0){ cout << "and "; } } if((n / 10) == 0){ number(n); } else if((n / 10) == 1) { switch(n) { case 10: cout << "ten "; break; case 11: cout << "eleven "; break; case 12: cout << "twelve "; break; case 13: cout << "thirteen "; break; case 14: cout << "fourteen "; break; case 15: cout << "fifteen "; break; case 16: cout << "sixteen "; break; case 17: cout << "seventeen "; break; case 18: cout << "eighteen "; break; case 19: cout << "nineteen "; break; } } else if((n / 10) > 1) { switch(n / 10) { case 2: cout << "twenty"; break; case 3: cout << "thirty"; break; case 4: cout << "forty"; break; case 5: cout << "fifty"; break; case 6: cout << "sixty"; break; case 7: cout << "seventy"; break; case 8: cout << "eighty"; break; case 9: cout << "ninety"; break; } n = n % 10; if(n != 0){ cout << "-"; number(n); } } } } else {// выводим тысячи, миллионы, миллиарды и т.д. if(n >= 1e15) { number(n / 1e15); cout << "billiard "; n %= (long long) 1e15; if(n != 0) number(n); } else if(n >= 1e12) { number(n / 1e12); cout << "billion "; n %= (long long) 1e12; if(n != 0) number(n); } else if(n >= 1e9) { number(n / 1e9); cout << "milliard "; n %= (int) 1e9; if(n != 0) number(n); } else if(n >= 1e6) { number(n / 1e6); cout << "million "; n %= (int) 1e6; if(n != 0) number(n); } else if(n >= 1e3) { number(n / 1e3); cout << "thousand "; n %= (int) 1e3; if(n != 0) number(n);// чтоб не выводить ноль после тысяч } } } int main() { long long n; cin >> n; number(n); return 0; } |
Для запроса на выполнение нажать здесь.
Решение
Данная программа выводит число «по частям», то есть вначале триллионы, затем биллиарды, биллионы и т.д. до единиц (за условием их наличия). Если число отрицательное, то она выводит «минус» и его абсолютную величину.
При выполнениии задания я воспользовалась длинной шкалой наименования чисел.
Программа выводит целые числа в промежутке [latex](-10^{19}; 10^{19})[/latex].
Хорошо. Но нужно
— сделать правильные отступы,
— придумать «говорящее» название для функции,
— сейчас половина работы функции делается в main, это не правильно. Можно воспользоваться рекурсией.
Исправила.
По-моему, Вы всё хорошо придумали.
Зачтено.