Задача 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, это не правильно. Можно воспользоваться рекурсией.
Исправила.
По-моему, Вы всё хорошо придумали.
Зачтено.