Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <string>
- #include <fstream>
- #include <iostream>
- std::string triada(const std::string& in, int tn) {
- if (in == " ") return "";
- if (in == "000") return "";
- static std::string sotni[9] =
- {"сто", "двести", "триста", "четыреста", "пятьсот",
- "шестьсот", "семьсот", "восемьсот", "девятьсот"};
- static std::string dubl[10] =
- {"десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать",
- "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать"};
- static std::string des[8] =
- {"двадцать", "тридцать", "сорок", "пятьдесят",
- "шестьдесят", "семьдясят", "восемьдясят", "девяносто"};
- static std::string ed[9] = {"один", "два", "три", "четыре", "пять", "шесть","семь", "восемь", "девять"};
- static std::string edj[9] = {"одна", "две", "три", "четыре", "пять", "шесть","семь", "восемь", "девять"};
- static std::string ind[5] = {"", " тысяч", " миллион", " миллиард", " триллион"};
- std::string out;
- std::string post;
- //
- // if () {
- //
- // }
- // количество сотен, если есть
- if (in[0] != ' ' && in[0] != '0') {
- out = out + sotni[in[0]-'1'];
- }
- // случай 10-19 в двузначной части числа
- if (in[1] == '1') {
- out = out + " " + dubl[in[2]-'0'];
- }
- // десятки 20-90
- if (in[1] != '1' && in[1] != ' ' && in[1] != '0') {
- out = out + " " + des[in[1]-'2'];
- }
- // единицы
- if (in[2] != '0' && in[1] != '1') {
- // если кол-во тысяч то используем другое окончание
- if (tn == 1)
- out = out + " " + edj[in[2]-'1'];
- else
- out = out + " " + ed[in[2]-'1'];
- }
- // добавляем приписку о тысячах, миллионах и т.д.
- if (tn > 0) {
- if (in[1] != '1')
- {
- // если 20-90 десятков
- // окончания для тысяч
- if (tn == 1)
- switch (in[2])
- {
- case '1': post = ind[tn] + "а"; break; // xx1
- case '2': post = ind[tn] + "и"; break; // хх2
- case '3': post = ind[tn] + "и"; break; // хх3
- case '4': post = ind[tn] + "и"; break; // хх4
- default : post = ind[tn] + ""; break; // хх5-хх9
- }
- // окончания для миллионов и далее
- if ((tn==2)||(tn==3)||(tn==4))
- switch (in[2])
- {
- case '1': post = ind[tn] + ""; break; // xx1
- case '2': post = ind[tn] + "а"; break; // хх2
- case '3': post = ind[tn] + "а"; break; // хх3
- case '4': post = ind[tn] + "а"; break; // хх4
- default : post = ind[tn] + "ов"; break;// хх5-хх9
- }
- }
- else
- {
- // случай 10-12 в двузначной части
- switch (tn)
- {
- case 1 : post = ind[tn]; break; // тысячи
- default : post = ind[tn] + "ов"; break; // миллионы и далее
- }
- }
- }
- out = out + post;
- return out;
- }
- std::string summa(std::string in)
- {
- std::string out;
- std::string trs[5];
- std::string tro[5];
- int n;
- // дополняем in в начале нулями до 15 знаков
- in.insert(0, 15-in.length(), ' ');
- // вставляем в trs[] части строки из in
- trs[0].insert(trs[0].begin(), in.c_str()+12, in.c_str()+15);
- trs[1].insert(trs[1].begin(), in.c_str()+9, in.c_str()+12);
- trs[2].insert(trs[2].begin(), in.c_str()+6, in.c_str()+9);
- trs[3].insert(trs[3].begin(), in.c_str()+3, in.c_str()+6);
- trs[4].insert(trs[4].begin(), in.c_str(), in.c_str()+3);
- // получаем части числа
- for (n=0;n<5;n++)
- {
- tro[n] = triada(trs[n], n);
- }
- // собираем число
- out = tro[4]+" "+tro[3]+" "+tro[2]+" "+tro[1]+" "+tro[0];
- return out;
- }
- std::string tostr(long long x)
- {
- if (x==0)
- return "0";
- std::string s = "";
- while (x>0)
- {
- char c = x%10+'0';
- s = c+s;
- x/=10;
- }
- return s;
- }
- int main()
- {
- freopen("input.txt","r",stdin);
- std::ofstream fout("output.txt");
- long long celaya;
- int kopeyki;
- while (scanf("%lli.%d",&celaya,&kopeyki))
- {
- std::string cel = summa(tostr(celaya));
- // выставляем локаль, чтобы установить русскую кодировку
- setlocale(LC_ALL, "Russian");
- std::cout << cel << " "<< kopeyki << " копеек\n";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement