Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/315: Рейтинг темы: голосов - 315, средняя оценка - 4.86
78 / 78 / 29
Регистрация: 01.08.2009
Сообщений: 177
1

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

05.01.2010, 16:44. Показов 64038. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я бы тоже внес свою лепту в форумский FAQ. Есть у меня программа которая конвертирует число от 1 до 999 в прописную строку.. Не раз наблюдал людей которым она необходима..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.01.2010, 16:44
Ответы с готовыми решениями:

Вывести число прописью
С клавиатуры вводится натуральное число, не превосходящее 1000. Представить его в виде...

Вывести число прописью
Задание преобразовать числа в слова, чтобы если пользователь вводит число 10 - то выводилось "Numx...

Вывести трехзначное число прописью
Дано целое число в диапазоне 100–999. Вывести строку-описание данного числа, например: 256 —...

Вывести четырехзначное число прописью
#include <iostream> #include <conio.h> using namespace std; int main() { setlocale(LC_ALL,...

21
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
08.01.2010, 15:10 2
2breeve: оформи в виде функции.
Причем лучше на C.
Не всем нужен C++.
И лучше чтобы функция брала числа от 0 до 999999 хотя бы.
А совсем хорошо - от 0 до MAX_INT.

Функция на C:
C++
1
char *itonumeral_ru( int n, size_t size, char *buf );
n - число
size - размер буфера
buf - буфер

Функция на С++:
C++
1
string itonumeral_ru( int n );
Добавлено через 7 минут
Функции не должны печатать числительное, а должны записывать его в строку.
А дальше уже вызывающая программа разберется - печатать его, или записывать в файл.
1
78 / 78 / 29
Регистрация: 01.08.2009
Сообщений: 177
10.01.2010, 20:29  [ТС] 3
Код получился грамоздким поскольку обрабатывал каждый порядок. сделал в си, в виде функции, до 999999, как просили.
Вот
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
char *itonumeral_ru( int n, size_t size, char *buf );
 
int main()
{
    char *str;
    char *buf;
    int choice;
    while(1)
    {
        printf("Vvedite chislo:\t");
        scanf("%u", &choice);
        str = itonumeral_ru(choice, 256, buf);
        printf("%s\n", str);
    }
    return 0;
}
 
char *itonumeral_ru( int n, size_t size, char *buf )
{
    char *one[] = {"","один ","два ","три ","четыре ","пять ","шесть ","семь ","восемь ","девять ",
                  "десять ","одиннадцать ","двенадцать ","тринадцать ","четырнадцать ","пятнадцать ",
                  "шестнадцать ","семнадцать ","восемнадцать ","девятнадцать " };
    char *ten[] = {"","", "двадцать ", "тридцать ", "сорок ", "пятьдесят ", "шестьдесят ", "семьдесят ", 
                  "восемьдесят ", "девяносто " };
    char *hundred[] = {"","сто ","двести ", "триста ", "четыреста ", "пятьсот ", "шестьсот ", 
                      "семьсот ", "восемьсот ", "девятьсот " };
    char *thouOne[] =  {"","одна ","две ","три ","четыре ","пять ","шесть ","семь ","восемь ","девять ",
                  "десять ","одиннадцать ","двенадцать ","тринадцать ","четырнадцать ","пятнадцать ",
                  "шестнадцать ","семнадцать ","восемнадцать ","девятнадцать " };                     
    char *thousand[] = {"тысяч ", "тысяча ", "тысячи ", "тысячи ", "тысячи ", "тысяч " ,"тысяч ", "тысяч ",
                "тысяч ","тысяч ","тысяч ","тысяч ","тысяч ","тысяч ","тысяч ","тысяч ","тысяч ","тысяч ","тысяч "
                "тысяч "};
    buf = malloc(size);
    sprintf(buf, "%u", n);
    int len = strlen(buf);
    int temp, temp2;
        switch(len)
{
    case 1:
        sprintf(buf,"%s", one[n]);
        break;
    case 2:
        if(n < 20)
        {
            sprintf(buf,"%s", one[n]);
        }
        else if(n < 100)
        {
            if((n%10)==0) sprintf(buf,"%s", ten[n/10]);
            else sprintf(buf,"%s%s", ten[n/10], one[n%10]);
        }
        break;
    case 3:
        temp = n/100;
        n -= (n/100)*100;
        if(n < 20)
        {
            sprintf(buf,"%s%s", hundred[temp], one[n]);
            
        }
        else if(n < 100)
        {
            if((n%10)==0) sprintf(buf,"%s%s", hundred[temp], ten[n/10]);
            else sprintf(buf,"%s%s%s", hundred[temp], ten[n/10], one[n%10]);
        }
        break;
    case 4:
        temp = n/1000;
        n -= (n/1000)*1000;
        sprintf(buf,"%s%s", thouOne[temp], thousand[temp]);
        temp = n/100;
        n -= (n/100)*100;
        if(n < 20)
        {
            strncat(buf, hundred[temp], 30);
            strncat(buf, one[n], 15);
        }
        else if(n < 100)
        {
            if((n%10)==0){
                 strncat(buf, hundred[temp], 30);
                 strncat(buf, ten[n/10], 30); 
             }
            else {
                strncat(buf, hundred[temp], 30);
                strncat(buf, ten[n/10], 30); 
                strncat(buf, one[n%10], 30);
            }
        }
        break;
    case 5:
        temp = n/1000;
        n -= (n/1000)*1000;
        if(temp<20){
            sprintf(buf,"%s%s", thouOne[temp], thousand[temp%10]);
        }
        else if(temp < 100)
        {
            if((temp%10)==0) sprintf(buf,"%s%s", ten[temp/10], thousand[temp%10]);
            else sprintf(buf,"%s%s%s", ten[temp/10], thouOne[temp%10], thousand[temp%10]);
        }
        temp = n/100;
        n -= (n/100)*100;
        if(n < 20)
        {
            strncat(buf, hundred[temp], 30);
            strncat(buf, one[n], 30);
            
        }
        else if(n < 100)
        {
            if((n%10)==0){
                 strncat(buf, hundred[temp], 30);
                 strncat(buf, ten[n/10], 30); 
             }
            else {
                strncat(buf, hundred[temp], 30);
                strncat(buf, ten[n/10], 30); 
                strncat(buf, one[n%10], 30);
            }
        }
        break;
    case 6:
        temp2 = n/1000;
        n -= (n/1000)*1000;
        
        temp = temp2/100;
        temp2 -=temp*100;
        
        if(temp2<20){
            sprintf(buf,"%s%s%s", hundred[temp], thouOne[temp2], thousand[temp2]);
        }
        else if(temp2 < 100)
        {
            if((temp%10)==0) sprintf(buf,"%s%s%s",hundred[temp], ten[temp2/10], thousand[temp2%10]);
            else sprintf(buf,"%s%s%s%s", hundred[temp],ten[temp2/10], thouOne[temp2%10], thousand[temp2%10]);
        }
        temp = n/100;
        n -= (n/100)*100;
        if(n < 20)
        {
            strncat(buf, hundred[temp], 30);
            strncat(buf, one[n], 30);
            
        }
        else if(n < 100)
        {
            if((n%10)==0){
                 strncat(buf, hundred[temp], 30);
                 strncat(buf, ten[n/10], 30); 
             }
            else {
                strncat(buf, hundred[temp], 30);
                strncat(buf, ten[n/10], 30); 
                strncat(buf, one[n%10], 30);
            }
        }
        break;
}
    
    
    return buf;                                
}
Можно было бы тысячи обрабатывать рекурсией, но там проблема была в склонениях(один,два - одна, две), тогда кода было бы почти в двое меньше..
3
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
10.01.2010, 21:14 4
Добавил ссылку в Большая коллекция решенных задач на эту тему.
Ждем отзывов
1
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
10.01.2010, 23:09 5
Лучший ответ Сообщение было отмечено как решение

Решение

Можно попробовать так:
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
#include <stdio.h>
 static char *sot[]={"сто","двести","триста","четыреста",
             "пят","шест", "сем","восем","девят" };
 static char *desiat[]={" двадцать"," тридцать"," сорок"," пят"," шест",
                " сем"," восем"," девяносто" };
 static char *edm[]={""," один"," два"," три"," четыре"," пять"," шесть",
             " семь"," восемь",
             " девять"," десять"," один"," две"," три",
             " четыр"," пят"," шест"," сем"," восем"," девят" };
 static char *edw[]={" одна"," две" };
 static char *nmtr[]={" тысяч"," миллион"," миллиард", " триллион",
               " квадриллион", " квинтиллион", " сектиллион", " септаллион", NULL };
         // дальше не знаю, м.б. товарищи подскажут ...
 static char *nokm[]={"а","ов" };
 static char *nokt[]={"а","и","" };
/* ------------------ */
Propis2(unsigned long L, int n, char *s) // Число прописью
{ int R, ns, nd, r; char *p; unsigned long M;
 
   M = L / 1000;
   R = L % 1000;
   if (M != 0) Propis2(M, n+1, s);  // Рекурсия!
   if (R==0) return;
   ns = R / 100;
   if (ns)    sprintf(s+strlen(s), " %s", sot[ns-1]);
   if (ns>=5) strcat(s, "ьсот");
   R = R % 100;  // < 100
   nd = R / 10;  // Десятки
   if (nd >= 2) {
      strcat(s, desiat[nd-2]);
      if (nd>=5 && nd<=8) strcat(s, "ьдесят");
      R = R % 10;
   }
   r = sklon(R);
   if (n==1 && R>0 && R<3) p = edw[R-1];
   else                    p = edm[R];
   strcat(s, p);
   if (R > 10) strcat(s, "надцать");
   if (n > 0) {
     strcat(s, nmtr[n-1]);
     if     (n==1) strcat(s, nokt[r]);
     else if (r>0) strcat(s, nokm[r-1]);
   }
}
/*********************/
sklon(int dd)    /* Определение склонения числа */
{ int n, r;
 
    r = 2;
    n = dd % 100;
    if (n>4 && n<20) return(r);
    n = n % 10;
    if      (n==1)       r = 0;
    else if (n>1 && n<5) r = 1;
    return(r);
}
/* ------------------ */
long atol(char *b);
main()
{ char b[200], s[1000]; unsigned long L;
 
a: printf(">");
   gets(b);
   if (strlen(b)==0) return;
   s[0] = '\0';
   L = atol(b);
   Propis2(L, 0, s);
   printf("%s\n", s);
   goto a;
}
/**********************/
Этот алгоритм несложно модифицировать и для более длинных чисел,
стоит только выбрать для них подходящее представление.
8
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
11.01.2010, 00:35 6
long в 4 байта дает максимум миллиард, поэтому дальше не нужно
0
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
11.01.2010, 11:18 7
Цитата Сообщение от odip Посмотреть сообщение
long в 4 байта дает максимум миллиард, поэтому дальше не нужно
Ваша правда, но алгоритм легко обобщается и для более длинных чисел с подходящим представлением.
А обрезать его до миллиарда, выкинуть лишнее - еще легче
1
7 / 7 / 0
Регистрация: 11.01.2010
Сообщений: 123
14.01.2010, 06:39 8
А до триллионов с дробями можно?

Добавлено через 1 минуту
Я делал и сам. Просто хочу сравнить. + может ещё кому пригодиться.
0
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
14.01.2010, 10:42 9
Цитата Сообщение от טאַראַס Посмотреть сообщение
А до триллионов с дробями можно?
Приведи, пожалуйста, пример
"число(с дробями) - его текст"
0
7 / 7 / 0
Регистрация: 11.01.2010
Сообщений: 123
14.01.2010, 11:24 10
Я просто криво написал. Я имел ввиду поддержку и целых, и дробей: 423185.434 в "четыреста двадцать тысяч сто восемьдесят пять целых четыреста тридцать четыре сысячных", а 43252345 в "сорок три миллиона двести пятьдесят две тысячи триста сорок пять".
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
14.01.2010, 12:54 11
Я делал и сам. Просто хочу сравнить. + может ещё кому пригодиться.
Давай - выберем лучший вариант
0
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
14.01.2010, 21:26 12
Лучший ответ Сообщение было отмечено как решение

Решение

Что-то в таком роде (вариант с дробями)
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 static char *sot[]={"сто","двести","триста","четыреста",
             "пят","шест", "сем","восем","девят" };
 static char *desiat[]={" двадцать"," тридцать"," сорок"," пят"," шест",
                " сем"," восем"," девяносто" };
 static char *edm[]={""," один"," два"," три"," четыре"," пять"," шесть",
             " семь"," восемь",
             " девять"," десять"," один"," две"," три",
             " четыр"," пят"," шест"," сем"," восем"," девят" };
 static char *edw[]={" одна"," две" };
 static char *nmtr[]={" тысяч"," миллион"," миллиард", " триллион",
               " квадриллион", " квинтиллион", " сектиллион", " септаллион", NULL };
         // дальше не знаю, м.б. товарищи подскажут ...
 static char *nokm[]={ "а" , "ов" };
 static char *nokt[]={ "а", "и", "" };
/* ------------------ */
Propis3(unsigned long L, int n, char *s, int rg) // Число прописью
{ int R, ns, nd, r; char *p; unsigned long M;
 
   if (n==0 && L==0) {
     strcat(s, " ноль ");
     return;
   }
   M = L / 1000;
   R = L % 1000;
   if (M != 0) Propis3(M, n+1, s, 0);  // Рекурсия!
   if (R==0) return;
   ns = R / 100;
   if (ns)    sprintf(s+strlen(s), " %s", sot[ns-1]);
   if (ns>=5) strcat(s, "ьсот");
   R = R % 100;  // < 100
   nd = R / 10;  // Десятки
   if (nd >= 2) {
      strcat(s, desiat[nd-2]);
      if (nd>=5 && nd<=8) strcat(s, "ьдесят");
      R = R % 10;
   }
   r = sklon(R);
   if (n==1 && R>0 && R<3) p = edw[R-1];
   else                    p = edm[R];
   if (rg==1 && n==0) {
     if      (R==1) p = " одна";
     else if (R==2) p = " две";
   }
   if (rg==2 && n==0 && R==1) p = " одна";
   strcat(s, p);
   if (R > 10) strcat(s, "надцать");
   if (n > 0) {
     strcat(s, nmtr[n-1]);
     if     (n==1) strcat(s, nokt[r]);
     else if (r>0) strcat(s, nokm[r-1]);
   }
}
/*********************/
sklon(int dd)    /* Определение склонения числа */
{ int n, r;
 
    r = 2;
    n = dd % 100;
    if (n>4 && n<20) return(r);
    n = n % 10;
    if      (n==1)       r = 0;
    else if (n>1 && n<5) r = 1;
    return(r);
}
/* ------------------ */
static char *drob[] = {
   " десят", " сот", " тысячн", " деятитысячн", " стотысячн",
   " миллионн", " десятимиллионн", " стомиллионн", " миллиардн",
   " десятимиллиардн", " стомиллиардн", " триллионн"  };
/* ------------------ */
main()
{ char b[200], s[1000], *d, *p; unsigned long L; int nn, k, rg;
 
a: printf(">");
   gets(b);
   if (strlen(b)==0) return;
   d = strchr(b, '.');
   if (d==NULL) rg = 0;
   else         rg = 2;
   s[0] = '\0';
   L = atol(b);
   Propis3(L, 0, s, rg);
   if (d!=NULL) {
     k = L % 10;
     if (k!=1) p = "целых";
     else      p = "целая";
     sprintf(s+strlen(s), " %s и ", p);
     L = atol(d+1);
     nn = 0;  // Кол-во дробных знаков
     for (nn=0, d=d+1; *d!='\0' && *d>='0' && *d<='9'; d++, nn++) ;
     if (nn==0) nn = 1;
     Propis3(L, 0, s+strlen(s), 1);
     strcat(s, drob[nn-1]);
     k = L % 10;
     if (k!=1) strcat(s, "ых");
     else      strcat(s, "ая");
   }
   printf("%s\n", s);
   goto a;
}
Если надо считать более длинные числа, давайте придумаем их представление.
У меня есть одно на примете, могу выложить.
4
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
03.07.2010, 14:40 13
как и было в задании(для С++) функция принимает целое число, и возвращает string-строку;
Числа от 0 до INT_MAX;

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
#include <iostream>
#include <conio.h>
 
std::string towords(int numb);
 
int main()
{
    int numb=INT_MAX;
    std::string str=towords(numb);
    std::cout<<numb<<" = "<<str;
    
    getch();
    return EXIT_SUCCESS;
}
 
std::string towords(int numb){
    //массив, для определения разряда, в котором находимся(сотни,десятки,еденицы...)
    int osn[11]={0,1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
 
    //массив оснований
    std::string basis[11][10]={
        {"","","","","","","","","",""},
        {"","один","два","три","четыре","пять","шесть","семь","восемь","девять"},
        {"","десять","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто"},
        {"","сто","двести","триста","четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот"},
        {"","одна","две","три","четыре","пять","шесть","семь","восемь","девять"},
        {"","десять","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто"},
        {"","сто","двести","триста","четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот"},
        {"","один","два","три","четыре","пять","шесть","семь","восемь","девять"},
        {"","десять","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто"},
        {"","сто","двести","триста","четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот"},
        {"","один","два","три ","четыре","пять","шесть","семь","восемь","девять"}};
 
    //массив окончаний
    std::string termination[10][10]={
        {"","","","тысяч","","","миллионов","","","миллиардов"},
        {"","","","тысяча","","","миллион","","","миллиард"},
        {"","","","тысячи","","","миллиона","","","миллиарда"},
        {"","","","тысячи","","","миллиона","","","миллиарда"},
        {"","","","тысячи","","","миллиона","","","миллиарда"},
        {"","","","тысяч","","","миллионов","","","миллиардов"},
        {"","","","тысяч","","","миллионов","","","миллиардов"},
        {"","","","тысяч","","","миллионов","","","миллиардов"},
        {"","","","тысяч","","","миллионов","","","миллиардов"},
        {"","","","тысяч","","","миллионов","","","миллиардов"}};
 
    std::string dec[10]={"десять","одиннадцать","двенадцать","тринадцать","четырнадцать","пятнадцать","шестнадцать","семнадцать","восемнадцать","девятнадцать"};
    std::string result;
 
    if (!numb){
        result="ноль";
        return result;
    }
    int n1=numb;
    int cnt=0;
 
    //подсчет количесива цифр в числе
    while (numb){
        numb/=10;
        ++cnt;
    }
    int celoe=0;
 
    //перевод
    while (n1){
        if (!((cnt+1) % 3)){
            if ((n1/osn[cnt])==1){
                    n1%=osn[cnt];
                    --cnt;
                    celoe=n1/osn[cnt];
                    n1%=osn[cnt];
                    result+=dec[celoe];
                --cnt;
                if (!(cnt % 3))
                    result+=" "+termination[0][cnt]+" ";
            }
            if (!cnt) break;
        }
        celoe=n1/osn[cnt];
        n1%=osn[cnt];
        result+=basis[cnt][celoe]+" ";
        --cnt;
        if (!(cnt % 3))
            result+=termination[celoe][cnt]+" ";
    }
 
    return result;
}
Добавлено через 14 часов 9 минут
Цитата Сообщение от Day Посмотреть сообщение
Если надо считать более длинные числа, давайте придумаем их представление.
int массив - самое лучшее
2
Эксперт С++
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
12.07.2010, 12:38 14
Инглиш.
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
char* to_text(int x)// 0 - 999999
{
    char res[100];
    char *ptr = res;
    const char *a[] = {"zero",
                "one",
                "two",
                "three",
                "four",
                "five",
                "six",
                "seven",
                "eight",
                "nine",
                "ten",
                "eleven",
                "twelve"};
    if(x <= 12)
    {
        ptr += sprintf(ptr,"%s ",a[x]);
        return strdup(res);
    }
    if(x >= 1000)
    {
        ptr += sprintf(ptr,to_text(x/1000));
        x %= 1000;
        ptr += sprintf(ptr,"thousand ");
    }
    if(x >= 100)
    {
        ptr += sprintf(ptr,"%s ",a[x/100]);
        x %= 100;
        ptr += sprintf(ptr,"hundred ");
    }
    if(x >= 20)
    {
        switch(x/10)
        {
            case 2 : ptr += sprintf(ptr,"twen"); break;
            case 3 : ptr += sprintf(ptr,"thir"); break;
            case 5 : ptr += sprintf(ptr,"fif"); break;
            case 8 : ptr += sprintf(ptr,"eigh"); break;
            default : ptr += sprintf(ptr,a[x/10]); break;
        }
        ptr += sprintf(ptr,"ty ");
        x %= 10;
    }
    if(x >= 13)
    {
        x %= 10;
        switch(x)
        {
            case 2 : ptr += sprintf(ptr,"twen"); break;
            case 3 : ptr += sprintf(ptr,"thir"); break;
            case 5 : ptr += sprintf(ptr,"fif"); break;
            case 8 : ptr += sprintf(ptr,"eigh"); break;
            default : ptr += sprintf(ptr,a[x]);
        }
        ptr += sprintf(ptr,"teen");
    }
    else if(x > 0)
        ptr += sprintf(ptr,"%s ",a[x]);
    return strdup(res);
}
1
133 / 132 / 29
Регистрация: 04.01.2009
Сообщений: 415
13.07.2010, 12:43 15
Не стал заморачиваться в консоли с языками, вот как вариант в ООП:
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
//$$---- Form CPP ----
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
    try
    {
        int num = Edit1->Text.ToInt();
        ToText(num);
    }
    catch(...)
    {
 
    }
}
 
String __fastcall ToLowerCase(String str, bool NotUse)
{
    return NotUse ? str : AnsiLowerCase(str);
}
 
void __fastcall TForm1::ToText(int Number)
{
    String Group[4][3] = {{"тысяча ",   "тысячи ",    "тысяч "},
                  {"миллион ",  "миллиона ",  "миллионов "},
                  {"миллиард ", "миллиарда ", "миллиардов "},
                  {"триллион ", "триллиона ", "триллионов "}};
 
    String All[3][10] = {{"", "Один ", "Два ", "Три ", "Четыре ", "Пять ", "Шесть ", "Семь ", "Восемь ", "Девять "},
                 {"", "", "Двадцать ","Тридцать ","Сорок ","Пятьдесят ","Шестьдесят ","Семдесят ","Восемдесят ","Девяносто "},
                 {"","Сто ","Двести ", "Тристо ", "Четыресто ", "Пятьсот ", "Шестьсот ", "Семьсот ","Восемсот ","Девятсот "}};
 
    String El_Nine[10] = { "Десять ",    "Одиннадцать ", "Двенадцать ", "Тринадцать ",   "Четырнадцать ",
                   "Пятнадцать ", "Шестнадцать ", "Семнадцать ", "Восемнадцать ", "Девятнадцать " };
 
    String NumStr = IntToStr(Number); //Number;
    int NumLength = NumStr.Length();
    int Groups = (NumLength-1)/3;
    String str = "";
    for (int i = Groups; i>=0; i--)
    {
        int k = (i==Groups ? NumLength - Groups*3 : 3);
        String NOG_Str = NumStr.SubString(NumLength+1-i*3-k,k);
        String strgr="";
 
        for (int j = 1; j<=k ; j++)
        {
            if (j==k-1 && NOG_Str[j] == '1')
            {
                strgr += ToLowerCase(El_Nine[StrToInt(NOG_Str[k])], i==Groups && j==1);
                break;
            }
            else 
            {
                if (i==1 && j==k && NOG_Str[j] == '1') strgr += ToLowerCase("Одна", i==Groups && j==1);
                else if (i==1 && j==k && NOG_Str[j] == '2') strgr += ToLowerCase("Две", i==Groups && j==1);
                else strgr += ToLowerCase(All[k-j][StrToInt(NOG_Str[j])], i==Groups && j==1);
            }
        }
        String grName = "";
        if (i>0 && NOG_Str.ToInt() > 0) 
        {
            int LOG = NOG_Str.ToInt()%100;
            if (LOG > 10 && LOG < 19 ) grName = Group[i-1][2];
            else if (LOG%10 == 1) grName = Group[i-1][0];
            else if (LOG%10 > 1 && LOG%10 < 5) grName = Group[i-1][1];
            else grName = Group[i-1][2];
        }
        str+=strgr + grName;
    }
        
    Label1->Caption = str;
}
 
//---------------------------------------------------------------------------

Если тип входящей переменной использовать не int, а переделать процедуру под строковый (а также изменить строку 50 кода), тогда расширяя массив Group можно преобразовывать большие числа

Добавлено через 19 часов 12 минут
Расширяем возможности до дробных чисел...

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
//$$---- Form CPP ----
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
    String Currency[2][4] = {{"рубль",   "рубля",   "рублей", "М"},
                 {"копейка", "копейки", "копеек", "Ж"}};
 
    try
    {
        Label1->Caption = ToText(Edit1->Text.ToDouble(), Currency);
    }
    catch(...)
    {
 
    }
}
 
String __fastcall ToLowerCase(String str, bool NotUse)
{
    return NotUse ? str : AnsiLowerCase(str);
}
 
String __fastcall TForm1::ToText(double Number, String Currency[2][4])
{
    String Group[4][3] = {{"тысяча ",   "тысячи ",    "тысяч "},
                  {"миллион ",  "миллиона ",  "миллионов "},
                  {"миллиард ", "миллиарда ", "миллиардов "},
                  {"триллион ", "триллиона ", "триллионов "}};
 
    String All[3][10] = {{"", "Один ", "Два ", "Три ", "Четыре ", "Пять ", "Шесть ", "Семь ", "Восемь ", "Девять "},
                 {"", "", "Двадцать ","Тридцать ","Сорок ","Пятьдесят ","Шестьдесят ","Семдесят ","Восемдесят ","Девяносто "},
                 {"","Сто ","Двести ", "Тристо ", "Четыресто ", "Пятьсот ", "Шестьсот ", "Семьсот ","Восемсот ","Девятсот "}};
 
    String El_Nine[10] = { "Десять ",    "Одиннадцать ", "Двенадцать ", "Тринадцать ",   "Четырнадцать ",
                   "Пятнадцать ", "Шестнадцать ", "Семнадцать ", "Восемнадцать ", "Девятнадцать " };
 
    String str = "";
    String FullStr = FloatToStr(Number);//IntToStr(Number);
    int DecPos = FullStr.Pos('.') > 0 ? FullStr.Pos('.') :
                 FullStr.Pos(',') > 0 ? FullStr.Pos(',') : FullStr.Length()+1;
 
    for (int s = 0; s <= (DecPos<FullStr.Length()); s++)
    {
        String NumStr = (!s ? FullStr.SubString(1,DecPos-1) : FullStr.SubString(DecPos+1,FullStr.Length()));
 
        int NumLength = NumStr.Length();
        int Groups = (NumLength-1)/3;
        for (int i = Groups; i>=0; i--)
        {
            int k = (i==Groups ? NumLength - Groups*3 : 3);
            String NOG_Str = NumStr.SubString(NumLength+1-i*3-k,k);
            String strgr="";
 
            for (int j = 1; j<=k ; j++)
            {
                bool LowerNotFirst = (s==0 && i==Groups && j==1);
                if (j==k-1 && NOG_Str[j] == '1')
                {
                    strgr += ToLowerCase(El_Nine[StrToInt(NOG_Str[k])], LowerNotFirst);
                    break;
                }
                else
                {
                    if ((j==k && NOG_Str[j] == '1') && (i>0 && Group[i-1][3] == "Ж" || Currency[s][3] == "Ж")) strgr += ToLowerCase("Одна ", LowerNotFirst);
                    else if ((j==k && NOG_Str[j] == '2') && (i>0 && Group[i-1][3] == "Ж" || Currency[s][3] == "Ж")) strgr += ToLowerCase("Две ", LowerNotFirst);
                    else strgr += ToLowerCase(All[k-j][StrToInt(NOG_Str[j])], LowerNotFirst);
                }
            }
            String grName = "";
            if (i>0 && NOG_Str.ToInt() > 0)
            {
                int LOG = NOG_Str.ToInt()%100;
                if (LOG > 10 && LOG < 19 ) grName = Group[i-1][2]+" ";
                else if (LOG%10 == 1) grName = Group[i-1][0]+" ";
                else if (LOG%10 > 1 && LOG%10 < 5) grName = Group[i-1][1]+" ";
                else grName = Group[i-1][2]+" ";
            }
            str+=strgr + grName;
        }
        int LOG = NumStr.ToInt()%100;
        if (LOG > 10 && LOG < 19 ) str += Currency[s][2] + " ";
        else if (LOG%10 == 1) str += Currency[s][0]+" ";
        else if (LOG%10 > 1 && LOG%10 < 5) str += Currency[s][1]+" ";
        else str += Currency[s][2]+" ";
    }
    return str;
}
 
//---------------------------------------------------------------------------
1
0 / 0 / 0
Регистрация: 28.06.2011
Сообщений: 3
24.11.2012, 15:10 16
народ, помогите плиз.
беру предложеные варианты на с++ и ни один не работает. что делать?
проект создаю в визуал студио 10. консольное приложение вин32
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
24.11.2012, 15:46 17
Цитата Сообщение от Oleshka777 Посмотреть сообщение
и ни один не работает.
Расшифруйте, плз.
0
0 / 0 / 0
Регистрация: 28.06.2011
Сообщений: 3
25.11.2012, 13:40 18
ругается сильно, выдает кучу ошибок, пробовал разобраться не получилось.
Нашел другой код, не много доделал,все работает.
Не могу только сделать чтоб русский писало.в команде не верный параметр, и какой надо не пойму.
0
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
07.02.2015, 22:36 19
как вариант, Сommon Lisp:
Lisp
1
2
> (1- (expt 10 66))
999999999999999999999999999999999999999999999999999999999999999999
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
> (format nil "~r" (1- (expt 10 66)))
"nine hundred and ninety-nine vigintillion, nine hundred and ninety-nine novemdecillion, 
nine hundred and ninety-nine octodecillion, nine hundred and ninety-nine septendecillion, 
nine hundred and ninety-nine sexdecillion, nine hundred and ninety-nine quindecillion, 
nine hundred and ninety-nine quattuordecillion, nine hundred and ninety-nine tredecillion, 
nine hundred and ninety-nine duodecillion, nine hundred and ninety-nine undecillion, nine 
hundred and ninety-nine decillion, nine hundred and ninety-nine nonillion, nine hundred 
and ninety-nine octillion, nine hundred and ninety-nine septillion, nine hundred and 
ninety-nine sextillion, nine hundred and ninety-nine quintillion, nine hundred and ninety-nine 
quadrillion, nine hundred and ninety-nine trillion, nine hundred and ninety-nine billion, 
nine hundred and ninety-nine million, nine hundred and ninety-nine thousand, 
nine hundred and ninety-nine"
0
2 / 2 / 3
Регистрация: 01.03.2015
Сообщений: 131
31.03.2015, 22:18 20
Цитата Сообщение от manfeese Посмотреть сообщение
ToText(num);
Привет не подскажите как подключить функцию , если я правильно понимаю
ошибка call to undedined function 'ToText'
0
31.03.2015, 22:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2015, 22:18
Помогаю со студенческими работами здесь

Вывести двузначное целое число прописью
&quot;Напишите программу, которая вводит целое число, не превышающее 100, и выводит его прописью,...

Вывести прописью введенное пользователем число
Код на С++ , который должен выводить введенное пользователем число прописью. #include &lt;iostream&gt;...

Вывести двузначное целое число прописью
Ввести целое число в диапазоне -99...99 и вывести в консоль его словесное описание. Пример: -57 –...

Вывести число прописью на английском языке
Задача заключается в том, чтобы из числа получить строку на английском, причём данное число в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru