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