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

Задачи и их решение / Вывести число прописью

 

Задача Преобразовать число к прописному текстовому виду, например
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
#define _CRT_SECURE_NO_WARNINGS // для использования strcpy()
#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 используется формула, приведенная здесь.

Результат выполнения
Число прописью


Назад: Задачи и их решение

Добавить комментарий

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