Задача Преобразовать число к прописному текстовому виду, например
2141 — Две тысячи сто сорок один.
Указанная задача возникает при необходимости вывести сумму прописью, а также может использоваться для составления капчи для сайтов (например, в форме комментариев ниже).
Перед решением задачи необходимо определиться с диапазоном ввода числа. Предположим, что вводимое число будет состоять из 4 разрядов:
- тысячи;
- сотни;
- десятки;
- единицы.
Для решения задачи необходимо разбить число на значащие разряды и каждому разряду поставить в соответствие некоторую текстовую строку. При этом необходимо учитывать, что числа в диапазоне от 10 до 20 не нужно разделять на десятки и единицы, например
11 — одиннадцать, в то время как
21 — двадцать один.
Реализация на C++
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
111
#include <iostream>
#include <time.h>
using namespace std;
void captcha(int num, char *s) // num — число, s — указатель на строку
{
int position = 0; // позиция в строке
int x[4]; // массив разрядов
int div = 1000; // делитель на разряды
int var = num; // частное от деления
int rest; // остаток от деления
for (int i = 0; i < 4; i++)
{
rest = (int)(var / div);
x[i] = rest;
var = var — rest*div;
div = div / 10;
}
// Тысячи
switch (x[0])
{
case 1: strcpy(s, "Одна тысяча "); break;
case 2: strcpy(s, "Две тысячи "); break;
case 3: strcpy(s, "Три тысячи "); break;
case 4: strcpy(s, "Четыре тысячи "); break;
case 5: strcpy(s, "Пять тысяч "); break;
case 6: strcpy(s, "Шесть тысяч "); break;
case 7: strcpy(s, "Семь тысяч "); break;
case 8: strcpy(s, "Восемь тысяч "); break;
case 9: strcpy(s, "Девять тысяч "); break;
default: break;
}
position = strlen(s);
// Сотни
switch (x[1])
{
case 1: strcpy(s + position, "сто "); break;
case 2: strcpy(s + position, "двести "); break;
case 3: strcpy(s + position, "триста "); break;
case 4: strcpy(s + position, "четыреста "); break;
case 5: strcpy(s + position, "пятьсот "); break;
case 6: strcpy(s + position, "шестьсот "); break;
case 7: strcpy(s + position, "семьсот "); break;
case 8: strcpy(s + position, "восемьсот "); break;
case 9: strcpy(s + position, "девятьсот "); break;
default: break;
}
position = strlen(s);
// Десятки
switch (x[2])
{
case 1:
// Числа от 10 до 19
switch (x[3])
{
case 0: strcpy(s + position, "десять "); break;
case 1: strcpy(s + position, "одиннадцать "); break;
case 2: strcpy(s + position, "двенадцать "); break;
case 3: strcpy(s + position, "тринадцать "); break;
case 4: strcpy(s + position, "четырнадцать "); break;
case 5: strcpy(s + position, "пятнадцать "); break;
case 6: strcpy(s + position, "шестнадцать "); break;
case 7: strcpy(s + position, "семнадцать "); break;
case 8: strcpy(s + position, "восемнадцать "); break;
case 9: strcpy(s + position, "девятнадцать "); break;
}
x[3] = 0;
position = strlen(s);
break;
case 2: strcpy(s + position, "двадцать "); break;
case 3: strcpy(s + position, "тридцать "); break;
case 4: strcpy(s + position, "сорок "); break;
case 5: strcpy(s + position, "пятьдесят "); break;
case 6: strcpy(s + position, "шестьдесят "); break;
case 7: strcpy(s + position, "семьдесят "); break;
case 8: strcpy(s + position, "восемьдесят "); break;
case 9: strcpy(s + position, "девяносто "); break;
default: break;
}
position = strlen(s);
// Единицы
switch (x[3]) {
case 1: strcpy(s + position, "один "); break;
case 2: strcpy(s + position, "два "); break;
case 3: strcpy(s + position, "три "); break;
case 4: strcpy(s + position, "четыре "); break;
case 5: strcpy(s + position, "пять "); break;
case 6: strcpy(s + position, "шесть "); break;
case 7: strcpy(s + position, "семь "); break;
case 8: strcpy(s + position, "восемь "); break;
case 9: strcpy(s + position, "девять "); break;
default: break;
}
position = strlen(s);
}
int main()
{
int m;
srand(time(NULL));
system("chcp 1251");
system("cls");
char s[80];
for (int i = 0; i<10; i++)
{
m = rand() % (10000 — 1000) + 1000;
captcha(m, s);
cout << m << " " << s << endl << endl;
}
cin.get();
return 0;
}
Для генерации случайных чисел в диапазоне 1000-9999 используется формула, приведенная здесь.
Результат выполнения
Назад: Задачи и их решения