#include <stdio.h>
#include <string.h>
#include <math.h>
const char* units[] = {"", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять",
"десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать",
"шестнадцать", "семнадцать", "восемнадцать", "девятнадцать"};
const char* tens[] = {"", "", "двадцать", "тридцать", "сорок", "пятьдесят", "шестьдесят", "семьдесят",
"восемьдесят", "девяносто"};
const char* hundreds[] = {"", "сто", "двести", "триста", "четыреста", "пятьсот", "шестьсот", "семьсот",
"восемьсот", "девятьсот"};
void get_rubles_form(int n, char* result) {
if (n
% 100 >= 11 && n
% 100 <= 19) strcpy(result
, "рублей "); else switch(n % 10) {
case 1: strcpy(result
, "рубль "); break; case 2: case 3: case 4: strcpy(result
, "рубля "); break; default: strcpy(result
, "рублей "); }
}
void convert_three_digits(int num, int is_thousands, char* result) {
result[0] = '\0';
if (num == 0) return;
int hundred = num / 100;
int rem = num % 100;
if (hundred > 0) {
strcat(result
, hundreds
[hundred
]); }
if (rem < 20) {
if (rem > 0) {
const char* word = units[rem];
if (is_thousands) {
if (rem == 1) word = "одна";
else if (rem == 2) word = "две";
}
}
} else {
strcat(result
, tens
[rem
/ 10]); int unit = rem % 10;
if (unit > 0) {
const char* word = units[unit];
if (is_thousands && unit == 1) word = "одна";
else if (is_thousands && unit == 2) word = "две";
}
}
}
void number_to_words(double amount, char* output) {
output[0] = '\0';
long rubles = (long)amount;
int kopecks = (int)round((amount - rubles) * 100);
if (rubles
== 0) strcat(output
, "ноль рублей "); else {
char part[100];
int millions = rubles / 1000000;
rubles %= 1000000;
int thousands = rubles / 1000;
rubles %= 1000;
if (millions > 0) {
convert_three_digits(millions, 0, part);
if (millions
% 100 >= 11 && millions
% 100 <= 14) strcat(output
, "миллионов "); else switch(millions % 10) {
case 1: strcat(output
, "миллион "); break; case 2: case 3: case 4: strcat(output
, "миллиона "); break; default: strcat(output
, "миллионов "); }
}
if (thousands > 0) {
convert_three_digits(thousands, 1, part);
if (thousands
% 100 >= 11 && thousands
% 100 <= 14) strcat(output
, "тысяч "); else switch(thousands % 10) {
case 1: strcat(output
, "тысяча "); break; case 2: case 3: case 4: strcat(output
, "тысячи "); break; default: strcat(output
, "тысяч "); }
}
if (rubles > 0) {
convert_three_digits(rubles, 0, part);
char rub_form[20];
get_rubles_form(rubles, rub_form);
}
}
char kop_str[3];
// Удаление двойных пробелов
char* pos;
while ((pos
= strstr(output
, " ")) != NULL
) }
int main() {
double amount;
char result[500];
number_to_words(amount, result);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPG1hdGguaD4KCmNvbnN0IGNoYXIqIHVuaXRzW10gPSB7IiIsICLQvtC00LjQvSIsICLQtNCy0LAiLCAi0YLRgNC4IiwgItGH0LXRgtGL0YDQtSIsICLQv9GP0YLRjCIsICLRiNC10YHRgtGMIiwgItGB0LXQvNGMIiwgItCy0L7RgdC10LzRjCIsICLQtNC10LLRj9GC0YwiLAogICAgICAgICAgICAgICAgICAgICAgItC00LXRgdGP0YLRjCIsICLQvtC00LjQvdC90LDQtNGG0LDRgtGMIiwgItC00LLQtdC90LDQtNGG0LDRgtGMIiwgItGC0YDQuNC90LDQtNGG0LDRgtGMIiwgItGH0LXRgtGL0YDQvdCw0LTRhtCw0YLRjCIsICLQv9GP0YLQvdCw0LTRhtCw0YLRjCIsCiAgICAgICAgICAgICAgICAgICAgICAi0YjQtdGB0YLQvdCw0LTRhtCw0YLRjCIsICLRgdC10LzQvdCw0LTRhtCw0YLRjCIsICLQstC+0YHQtdC80L3QsNC00YbQsNGC0YwiLCAi0LTQtdCy0Y/RgtC90LDQtNGG0LDRgtGMIn07CmNvbnN0IGNoYXIqIHRlbnNbXSA9IHsiIiwgIiIsICLQtNCy0LDQtNGG0LDRgtGMIiwgItGC0YDQuNC00YbQsNGC0YwiLCAi0YHQvtGA0L7QuiIsICLQv9GP0YLRjNC00LXRgdGP0YIiLCAi0YjQtdGB0YLRjNC00LXRgdGP0YIiLCAi0YHQtdC80YzQtNC10YHRj9GCIiwKICAgICAgICAgICAgICAgICAgICAgItCy0L7RgdC10LzRjNC00LXRgdGP0YIiLCAi0LTQtdCy0Y/QvdC+0YHRgtC+In07CmNvbnN0IGNoYXIqIGh1bmRyZWRzW10gPSB7IiIsICLRgdGC0L4iLCAi0LTQstC10YHRgtC4IiwgItGC0YDQuNGB0YLQsCIsICLRh9C10YLRi9GA0LXRgdGC0LAiLCAi0L/Rj9GC0YzRgdC+0YIiLCAi0YjQtdGB0YLRjNGB0L7RgiIsICLRgdC10LzRjNGB0L7RgiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAi0LLQvtGB0LXQvNGM0YHQvtGCIiwgItC00LXQstGP0YLRjNGB0L7RgiJ9OwoKdm9pZCBnZXRfcnVibGVzX2Zvcm0oaW50IG4sIGNoYXIqIHJlc3VsdCkgewogICAgaWYgKG4gJSAxMDAgPj0gMTEgJiYgbiAlIDEwMCA8PSAxOSkgc3RyY3B5KHJlc3VsdCwgItGA0YPQsdC70LXQuSAiKTsKICAgIGVsc2Ugc3dpdGNoKG4gJSAxMCkgewogICAgICAgIGNhc2UgMTogc3RyY3B5KHJlc3VsdCwgItGA0YPQsdC70YwgIik7IGJyZWFrOwogICAgICAgIGNhc2UgMjogY2FzZSAzOiBjYXNlIDQ6IHN0cmNweShyZXN1bHQsICLRgNGD0LHQu9GPICIpOyBicmVhazsKICAgICAgICBkZWZhdWx0OiBzdHJjcHkocmVzdWx0LCAi0YDRg9Cx0LvQtdC5ICIpOwogICAgfQp9Cgp2b2lkIGNvbnZlcnRfdGhyZWVfZGlnaXRzKGludCBudW0sIGludCBpc190aG91c2FuZHMsIGNoYXIqIHJlc3VsdCkgewogICAgcmVzdWx0WzBdID0gJ1wwJzsKICAgIGlmIChudW0gPT0gMCkgcmV0dXJuOwogICAgCiAgICBpbnQgaHVuZHJlZCA9IG51bSAvIDEwMDsKICAgIGludCByZW0gPSBudW0gJSAxMDA7CiAgICAKICAgIGlmIChodW5kcmVkID4gMCkgewogICAgICAgIHN0cmNhdChyZXN1bHQsIGh1bmRyZWRzW2h1bmRyZWRdKTsKICAgICAgICBzdHJjYXQocmVzdWx0LCAiICIpOwogICAgfQogICAgaWYgKHJlbSA8IDIwKSB7CiAgICAgICAgaWYgKHJlbSA+IDApIHsKICAgICAgICAgICAgY29uc3QgY2hhciogd29yZCA9IHVuaXRzW3JlbV07CiAgICAgICAgICAgIGlmIChpc190aG91c2FuZHMpIHsKICAgICAgICAgICAgICAgIGlmIChyZW0gPT0gMSkgd29yZCA9ICLQvtC00L3QsCI7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZW0gPT0gMikgd29yZCA9ICLQtNCy0LUiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0cmNhdChyZXN1bHQsIHdvcmQpOwogICAgICAgICAgICBzdHJjYXQocmVzdWx0LCAiICIpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgc3RyY2F0KHJlc3VsdCwgdGVuc1tyZW0gLyAxMF0pOwogICAgICAgIHN0cmNhdChyZXN1bHQsICIgIik7CiAgICAgICAgaW50IHVuaXQgPSByZW0gJSAxMDsKICAgICAgICBpZiAodW5pdCA+IDApIHsKICAgICAgICAgICAgY29uc3QgY2hhciogd29yZCA9IHVuaXRzW3VuaXRdOwogICAgICAgICAgICBpZiAoaXNfdGhvdXNhbmRzICYmIHVuaXQgPT0gMSkgd29yZCA9ICLQvtC00L3QsCI7CiAgICAgICAgICAgIGVsc2UgaWYgKGlzX3Rob3VzYW5kcyAmJiB1bml0ID09IDIpIHdvcmQgPSAi0LTQstC1IjsKICAgICAgICAgICAgc3RyY2F0KHJlc3VsdCwgd29yZCk7CiAgICAgICAgICAgIHN0cmNhdChyZXN1bHQsICIgIik7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIG51bWJlcl90b193b3Jkcyhkb3VibGUgYW1vdW50LCBjaGFyKiBvdXRwdXQpIHsKICAgIG91dHB1dFswXSA9ICdcMCc7CiAgICBsb25nIHJ1YmxlcyA9IChsb25nKWFtb3VudDsKICAgIGludCBrb3BlY2tzID0gKGludClyb3VuZCgoYW1vdW50IC0gcnVibGVzKSAqIDEwMCk7CiAgICAKICAgIGlmIChydWJsZXMgPT0gMCkgc3RyY2F0KG91dHB1dCwgItC90L7Qu9GMINGA0YPQsdC70LXQuSAiKTsKICAgIGVsc2UgewogICAgICAgIGNoYXIgcGFydFsxMDBdOwogICAgICAgIGludCBtaWxsaW9ucyA9IHJ1YmxlcyAvIDEwMDAwMDA7CiAgICAgICAgcnVibGVzICU9IDEwMDAwMDA7CiAgICAgICAgaW50IHRob3VzYW5kcyA9IHJ1YmxlcyAvIDEwMDA7CiAgICAgICAgcnVibGVzICU9IDEwMDA7CiAgICAgICAgCiAgICAgICAgaWYgKG1pbGxpb25zID4gMCkgewogICAgICAgICAgICBjb252ZXJ0X3RocmVlX2RpZ2l0cyhtaWxsaW9ucywgMCwgcGFydCk7CiAgICAgICAgICAgIHN0cmNhdChvdXRwdXQsIHBhcnQpOwogICAgICAgICAgICBpZiAobWlsbGlvbnMgJSAxMDAgPj0gMTEgJiYgbWlsbGlvbnMgJSAxMDAgPD0gMTQpIHN0cmNhdChvdXRwdXQsICLQvNC40LvQu9C40L7QvdC+0LIgIik7CiAgICAgICAgICAgIGVsc2Ugc3dpdGNoKG1pbGxpb25zICUgMTApIHsKICAgICAgICAgICAgICAgIGNhc2UgMTogc3RyY2F0KG91dHB1dCwgItC80LjQu9C70LjQvtC9ICIpOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMjogY2FzZSAzOiBjYXNlIDQ6IHN0cmNhdChvdXRwdXQsICLQvNC40LvQu9C40L7QvdCwICIpOyBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHN0cmNhdChvdXRwdXQsICLQvNC40LvQu9C40L7QvdC+0LIgIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRob3VzYW5kcyA+IDApIHsKICAgICAgICAgICAgY29udmVydF90aHJlZV9kaWdpdHModGhvdXNhbmRzLCAxLCBwYXJ0KTsKICAgICAgICAgICAgc3RyY2F0KG91dHB1dCwgcGFydCk7CiAgICAgICAgICAgIGlmICh0aG91c2FuZHMgJSAxMDAgPj0gMTEgJiYgdGhvdXNhbmRzICUgMTAwIDw9IDE0KSBzdHJjYXQob3V0cHV0LCAi0YLRi9GB0Y/RhyAiKTsKICAgICAgICAgICAgZWxzZSBzd2l0Y2godGhvdXNhbmRzICUgMTApIHsKICAgICAgICAgICAgICAgIGNhc2UgMTogc3RyY2F0KG91dHB1dCwgItGC0YvRgdGP0YfQsCAiKTsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDI6IGNhc2UgMzogY2FzZSA0OiBzdHJjYXQob3V0cHV0LCAi0YLRi9GB0Y/Rh9C4ICIpOyBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHN0cmNhdChvdXRwdXQsICLRgtGL0YHRj9GHICIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChydWJsZXMgPiAwKSB7CiAgICAgICAgICAgIGNvbnZlcnRfdGhyZWVfZGlnaXRzKHJ1YmxlcywgMCwgcGFydCk7CiAgICAgICAgICAgIHN0cmNhdChvdXRwdXQsIHBhcnQpOwogICAgICAgICAgICBjaGFyIHJ1Yl9mb3JtWzIwXTsKICAgICAgICAgICAgZ2V0X3J1Ymxlc19mb3JtKHJ1YmxlcywgcnViX2Zvcm0pOwogICAgICAgICAgICBzdHJjYXQob3V0cHV0LCBydWJfZm9ybSk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBjaGFyIGtvcF9zdHJbM107CiAgICBzcHJpbnRmKGtvcF9zdHIsICIlMDJkIiwga29wZWNrcyk7CiAgICBzdHJjYXQob3V0cHV0LCBrb3Bfc3RyKTsKICAgIHN0cmNhdChvdXRwdXQsICIg0LrQvtC/0LXQtdC6LiIpOwogICAgCiAgICAvLyDQo9C00LDQu9C10L3QuNC1INC00LLQvtC50L3Ri9GFINC/0YDQvtCx0LXQu9C+0LIKICAgIGNoYXIqIHBvczsKICAgIHdoaWxlICgocG9zID0gc3Ryc3RyKG91dHB1dCwgIiAgIikpICE9IE5VTEwpIAogICAgICAgIG1lbW1vdmUocG9zLCBwb3MgKyAxLCBzdHJsZW4ocG9zKSk7Cn0KCmludCBtYWluKCkgewogICAgZG91YmxlIGFtb3VudDsKICAgIHByaW50Zigi0JLQstC10LTQuNGC0LUg0YHRg9C80LzRgzogIik7CiAgICBzY2FuZigiJWxmIiwgJmFtb3VudCk7CiAgICBjaGFyIHJlc3VsdFs1MDBdOwogICAgbnVtYmVyX3RvX3dvcmRzKGFtb3VudCwgcmVzdWx0KTsKICAgIHByaW50ZigiJXNcbiIsIHJlc3VsdCk7CiAgICByZXR1cm4gMDsKfQo=