Вывести число прописью

Вывести число прописью

Задача Преобразовать число к прописному текстовому виду, например

2141 — Две тысячи сто сорок один

Указанная задача возникает при необходимости вывести сумму прописью, а также может использоваться для составления капчи для сайтов.

Перед решением задачи необходимо определиться с диапазоном ввода числа.

Предположим, что вводимое число будет состоять из 4 разрядов:

  • тысячи;
  • сотни;
  • десятки;
  • единицы.

Для решения задачи необходимо разбить число на значащие разряды и каждому разряду поставить в соответствие некоторую текстовую строку. При этом необходимо учитывать, что числа в диапазоне от 10 до 20 не нужно разделять на десятки и единицы, например

11 — одиннадцать,

в то время как 21 — двадцать один.

Реализация на C++
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
111
112
113
#include <iostream>
#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 используется формула, приведенная здесь.

Результат выполнения

Число прописью

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх