Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
23 / 20 / 5
Регистрация: 04.01.2020
Сообщений: 141

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

26.12.2024, 14:49. Показов 3837. Ответов 34

Студворк — интернет-сервис помощи студентам
Есть такая задача:
Вывести заданное целое положительное число a прописью. Например, 7 – семь, 26 –
двадцать шесть, 145 – сто сорок пять.

Подскажите с решением, в голову лезет только решение через разделение числа на разряды и огромного числа switch.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.12.2024, 14:49
Ответы с готовыми решениями:

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

Вывести число прописью
Ввести чотиризначне число, вивести його текстом на екран(5243 – пять тисяч двісті сорок три)

Вывести число прописью
Задание преобразовать числа в слова, чтобы если пользователь вводит число 10 - то выводилось "Numx is equal to 'ten'" Но я не...

34
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6289 / 3013 / 1051
Регистрация: 01.06.2021
Сообщений: 11,349
27.12.2024, 13:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от VluDs Посмотреть сообщение
С чего вы вообще решили, что я это где то скопировал?
ты хочешь сказать, что алгоритм BinaryPow ты сам придумал / заново открыл? чёт мне кажется, что человек, который смог бы сам реализовать, не обращаясь к существующей информации, мог бы без проблем написать хороший код и не задавать вопросов на форуме.
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,205
27.12.2024, 13:56
И слово pow не хорошее.
Это зарезервированное слово.

C++
1
2
3
4
5
6
using namespace std;
 
int main() {
 
  // computes 5 raised to the power 3
  cout << pow(5, 3);
Может оно здесь и работает, но привычка это плохая.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6289 / 3013 / 1051
Регистрация: 01.06.2021
Сообщений: 11,349
27.12.2024, 13:57
Цитата Сообщение от VluDs Посмотреть сообщение
вчера показалось, что без этой строчки, при нулевой степени выдается неверное значение
т.е. ты сам написал while (pow), но не знаешь, что означает false в С++?
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,205
27.12.2024, 13:59
Цитата Сообщение от Royal_X Посмотреть сообщение
алгоритм BinaryPow ты сам придумал
Да все мы воруем по немногу.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6289 / 3013 / 1051
Регистрация: 01.06.2021
Сообщений: 11,349
27.12.2024, 14:02
Цитата Сообщение от Наталья8 Посмотреть сообщение
Да все мы воруем по немногу.
поэтому я и выше написал, что он своровал плохой код и дескать можно было в инете найти более хороший код. Я не имел намерения критиковать ТС за то, что он своровал. Я его критиковал, что он своровал говно-код.
Но тут понеслось. Он мне лапшу на уши вешает, что типа сам написал. Вот это я не приемлю.

Хотя, вот сейчас смотрю на код, то может быть что-то он сам писал)))
1
23 / 20 / 5
Регистрация: 04.01.2020
Сообщений: 141
27.12.2024, 14:03  [ТС]
Алгоритм бинарного возведения в степень я скопировал да. Я это не скрываю, это очень популярный алгоритм, я смысл мне врать, что я его сам написал.
Но вы так выразились, как будто я все под чистую скопировал.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6289 / 3013 / 1051
Регистрация: 01.06.2021
Сообщений: 11,349
27.12.2024, 14:06
Цитата Сообщение от VluDs Посмотреть сообщение
как будто я все под чистую скопировал.
ну хорошо

только почему ты для английский чисел сделал? тебе ж нужно для русских

Цитата Сообщение от VluDs Посмотреть сообщение
Вывести заданное целое положительное число a прописью. Например, 7 – семь, 26 –
двадцать шесть, 145 – сто сорок пять.
0
23 / 20 / 5
Регистрация: 04.01.2020
Сообщений: 141
27.12.2024, 14:08  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
почему ты для английский чисел сделал
Мне показалось так легче будет реализовать. Да и честно говоря, не очень люблю кириллицу в консоли.
0
27.12.2024, 14:12

Не по теме:

Цитата Сообщение от VluDs Посмотреть сообщение
не очень люблю кириллицу в консоли
т.е. условие можно не соблюдать и делать, как нравится?
Цитата Сообщение от VluDs Посмотреть сообщение
Мне показалось так легче будет реализовать.
правильно показалось) с русскими окончаниями будет чуточку сложнее

0
23 / 20 / 5
Регистрация: 04.01.2020
Сообщений: 141
27.12.2024, 14:14  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
условие можно не соблюдать и делать, как нравится
Вообще нет, но эту задачу я решал для себя.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6289 / 3013 / 1051
Регистрация: 01.06.2021
Сообщений: 11,349
27.12.2024, 14:18
Цитата Сообщение от VluDs Посмотреть сообщение
я решал для себя.
джедаи должны выбирать сложный путь. Предлагаю французский.

Во французском есть отдельные слова для чисел от 0 до 16, а также для десятков от 10 до 60.

17 это 10 - 7
18 это 10 - 8
19 это 10 - 9
Для числа 79 нужно писать 60 - 10 - 9
Для 80 нужно писать 4 - 20
Для 99 нужно писать 4 - 20 - 10 - 9
Для 94 нужно писать 4 - 20 - 14
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,311
29.12.2024, 09:06
C++ (Qt)
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
//функция добавляет пробелы в число 12345678 -> 12 345 678
//---------------------------------------------------------------------------
QString fn_SpsToInt(QString str)
{
    int x = str.length() - 3;
    while(x > 0) {str.insert(x, QString(" ")); x -= 3;}
 
    return str;
}
 
 
 
 
// ***********************************************************************************
// функция обрабатывает по три цифры
QString fnThreeDigitText(int xx)
{
 
    QString edn[] = {"", "один", "два", "три", "четыре", "пять",
                   "шесть", "семь", "восемь", "девять", "десять",
                   "одиннадцать", "двенадцать", "тринадцать",
                   "четырнадцать", "пятнадцать", "шестнадцать",
                   "семнадцать", "восемнадцать", "девятнадцать"
                  };
 
    QString dec[] = {"двадцать", "тридцать", "сорок", "пятьдесят",
                   "шестьдесят", "семьдесят", "восемьдесят", "девяносто"};
 
    QString han[] = {"сто", "двести" ,"триста", "четыреста", "пятьсот",
                   "шестьсот", "семьсот", "восемьсот", "девятьсот"};
 
    QString str;
 
 
    int y = xx / 100;
 
    if(y > 0) str = han[y-1] + " ";
 
    xx = xx % 100;
    y = xx / 10;
 
    if(xx > 19)
    {
         str += dec[y-2] + " ";
         xx = xx % 10;
    }
 
    str += edn[xx];
 
    return str;
}
 
 
 
 
// ***********************************************************************************
// функция превращения числа в строку слов
QString fnOllDigitsText(qint64 xx)
{
    // return если ноль
    if(xx == 0) return "ноль";
 
    int y, z, сx = 0;
 
    QString s1, s2, rez;
    QString gig[] = {"", "тысяч", "миллион", "миллиард", "триллион"};
 
 
    // собсна процесс превращения числа в строку слов
    while(xx > 0)
    {
        if(xx % 1000)
        {
            y = xx % 10;
            z = xx % 100;
 
            s1 = fnThreeDigitText(xx % 1000);
            s2 = gig[сx];
 
            // отсюда начинаются шаманские танцы с бубном
            // с целью изменения склонений и спряжений
            if(сx == 1)
            {
                if((z < 10) || (z > 20))
                {
                    if(y == 1) s2 += "а";
                    if((y > 1) && (y < 5)) s2 += "и";
 
                    if(y == 1) s1.replace(s1.length()-2, 2, "на");
                    if(y == 2) s1.replace(s1.length()-2, 2, "ве");
                }
            }
 
            if(сx > 1)
            {
                if((z > 10) && (z < 21)) s2 += "ов";
 
                else if((y > 1) && (y < 5)) s2 += "а";
                else if((y == 0) || (y > 4)) s2 += "ов";
            }
            // конец шаманских танцев с бубном
 
 
            rez = "\n" + s1 + " " + s2 + ", " + rez;
        }
 
        сx++;
        xx = xx / 1000;
    }
 
 
    // удаляем лишние последние пробелы и запятые
    y = rez.length();
    сx = 0;
 
    while(y--)
    {
        if((rez.at(y) == ' ')||(rez.at(y) == ',')) сx++;
        else break;
    }
 
    rez.resize(rez.length() - сx);
 
    // удаляем непечатные символы с начала и конца строки
    // и добавляем точку в конце
    rez = rez.trimmed();   // + ".";
 
    // делаем первую букву заглавной
    rez[0] = rez.at(0).toUpper();
 
    return rez;
}
Миниатюры
Вывести число прописью  
2
 Аватар для analogov net
2532 / 1130 / 494
Регистрация: 17.11.2018
Сообщений: 2,838
04.01.2025, 04:43
Цитата Сообщение от VluDs Посмотреть сообщение
но эту задачу я решал для себя.
Можно попробовать, только нужно потестировать:
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
#include <iostream>
#include <string>
#include <clocale>
 
const std::string ones[]    = {"", "один ", "два ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять "};
const std::string ones_th[] = {"", "одна ", "две ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять "};
const std::string teens[]   = {"", "одиннадцать ", "двенадцать ", "тринадцать ", "четырнадцать ", "пятнадцать ", "шестнадцать ", "семнадцать ", "восемнадцать ", "девятнадцать "};
const std::string tens[]    = {"", "десять ", "двадцать ", "тридцать ", "сорок ", "пятьдесят ", "шестьдесят ", "семьдесят ", "восемьдесят ", "девяносто "};
const std::string hundr[]   = {"", "сто ", "двести ", "триста ", "четыреста ", "пятьсот ", "шестьсот ", "семьсот ", "восемьсот ", "девятьсот "};
const std::string ends_1[]  = {"", "тысяча ", "миллион ", "миллиард ", "триллион ", "квинтиллион ", "квадриллион "};
const std::string ends_2[]  = {"", "тысячи ", "миллиона ", "миллиарда ", "триллиона ", "квинтиллиона ", "квадриллиона "};
const std::string ends_5[]  = {"", "тысяч ", "миллионов ", "миллиардов ", "триллионов ", "квинтиллионов ", "квадриллионов "};
 
int main(){
    setlocale( LC_ALL, "Rus" );
    unsigned long long num;
 
    std::cout << "Введите число (не более 19 знаков): ";
    std::cin >> num;
 
    std::string format = std::to_string( num );
    for( int i = static_cast<int>( format.size() ) - 3; i > 0; i -= 3 )
        format.insert( i, " " );
 
    if( !num )
        std::cout << "0 - ноль" << std::endl;
    else{       
        std::string result;
        for( int i = 0; num > 0; num /= 1000, i++ ){
            int part = num % 1000;
            if( part ){
                std::string block = hundr[part / 100];
                unsigned int last_two_dig = part % 100;
 
                if( last_two_dig > 10 && last_two_dig < 20 )
                    block += teens[last_two_dig - 10];
                else
                    block += tens[last_two_dig / 10] + ( i == 1 ? ones_th[last_two_dig % 10] : ones[last_two_dig % 10] );
 
                if( i > 0 ){
                    int first = ( part / 10 ) % 10;
                    int last = part % 10;
 
                    block += ( first == 1 || !last || last >= 5 ) ? ends_5[i] : ( last == 1 ) ? ends_1[i] : ends_2[i];
                }
                result = block + result;
            }
        }       
        std::cout << format << " - " << result << std::endl;
    }
}
Добавлено через 5 минут
Code
1
2
Введите число (не более 19 знаков): 1234567890987654321
1 234 567 890 987 654 321 - один квадриллион двести тридцать четыре квинтиллиона пятьсот шестьдесят семь триллионов восемьсот девяносто миллиардов девятьсот восемьдесят семь миллионов шестьсот пятьдесят четыре тысячи триста двадцать один
1
 Аватар для analogov net
2532 / 1130 / 494
Регистрация: 17.11.2018
Сообщений: 2,838
04.01.2025, 22:37
В массивах строк нужно поменять местами "квинтиллионы" с "квадриллионами".
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,205
04.01.2025, 23:42
Цитата Сообщение от analogov net Посмотреть сообщение
Всякое решение плодит новые проблемы.
--------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.01.2025, 23:42

Вывести число прописью
Я бы тоже внес свою лепту в форумский FAQ. Есть у меня программа которая конвертирует число от 1 до 999 в прописную строку.. Не раз...

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

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

Вывести четырехзначное число прописью
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;Russian&quot;); int a; cout &lt;&lt; &quot;Введите...

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


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Remote Connection Manager
DevAlt 21.06.2026
Написал для себя небольшую прилагу: https:/ / github. com/ altbodhi/ ReConMan По итогу пришел к мысли, что DU не дружат с существующими технологиями. От сериализации до отображения в реляционную. . .
Администрация Хабра удаляет новые энрегоэфективные алгоритмы, которые не западной школы кода, и вовсе никак не сгенерировавны.
Hrethgir 20.06.2026
Делается это, как замечено, при правках - при объявлении концептуальных отличий в алгоримах. Делается это, по линейке событий - после дополнения публикации основными отличиями от основных западных. . .
Процесс ориентированная диалектика (не новость - просто системное обновление, философия).
Hrethgir 20.06.2026
Однажды один участник в своём блоге, на этом форуме, сделал запись "О языках замолвите слово". Понимая, что язык - важная вещь, я решил хорошо подумать, прежде чем сказать, и сказал то, что вы видите. . .
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru