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

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

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

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

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

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

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

Реализация

#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 не будет опубликован. Обязательные поля помечены *