Advertisement
Guest User

Untitled

a guest
Dec 6th, 2016
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.22 KB | None | 0 0
  1. #include <string>
  2. #include <fstream>
  3. #include <iostream>
  4.  
  5. std::string triada(const std::string& in, int tn) {
  6. if (in == " ") return "";
  7. if (in == "000") return "";
  8.  
  9. static std::string sotni[9] =
  10. {"сто", "двести", "триста", "четыреста", "пятьсот",
  11. "шестьсот", "семьсот", "восемьсот", "девятьсот"};
  12. static std::string dubl[10] =
  13. {"десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать",
  14. "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать"};
  15. static std::string des[8] =
  16. {"двадцать", "тридцать", "сорок", "пятьдесят",
  17. "шестьдесят", "семьдясят", "восемьдясят", "девяносто"};
  18. static std::string ed[9] = {"один", "два", "три", "четыре", "пять", "шесть","семь", "восемь", "девять"};
  19. static std::string edj[9] = {"одна", "две", "три", "четыре", "пять", "шесть","семь", "восемь", "девять"};
  20. static std::string ind[5] = {"", " тысяч", " миллион", " миллиард", " триллион"};
  21.  
  22. std::string out;
  23. std::string post;
  24. //
  25. // if () {
  26. //
  27. // }
  28. // количество сотен, если есть
  29. if (in[0] != ' ' && in[0] != '0') {
  30. out = out + sotni[in[0]-'1'];
  31. }
  32.  
  33. // случай 10-19 в двузначной части числа
  34. if (in[1] == '1') {
  35. out = out + " " + dubl[in[2]-'0'];
  36. }
  37.  
  38. // десятки 20-90
  39. if (in[1] != '1' && in[1] != ' ' && in[1] != '0') {
  40. out = out + " " + des[in[1]-'2'];
  41. }
  42.  
  43. // единицы
  44. if (in[2] != '0' && in[1] != '1') {
  45. // если кол-во тысяч то используем другое окончание
  46. if (tn == 1)
  47. out = out + " " + edj[in[2]-'1'];
  48. else
  49. out = out + " " + ed[in[2]-'1'];
  50. }
  51.  
  52. // добавляем приписку о тысячах, миллионах и т.д.
  53. if (tn > 0) {
  54. if (in[1] != '1')
  55. {
  56. // если 20-90 десятков
  57. // окончания для тысяч
  58. if (tn == 1)
  59. switch (in[2])
  60. {
  61. case '1': post = ind[tn] + "а"; break; // xx1
  62. case '2': post = ind[tn] + "и"; break; // хх2
  63. case '3': post = ind[tn] + "и"; break; // хх3
  64. case '4': post = ind[tn] + "и"; break; // хх4
  65. default : post = ind[tn] + ""; break; // хх5-хх9
  66. }
  67. // окончания для миллионов и далее
  68. if ((tn==2)||(tn==3)||(tn==4))
  69. switch (in[2])
  70. {
  71. case '1': post = ind[tn] + ""; break; // xx1
  72. case '2': post = ind[tn] + "а"; break; // хх2
  73. case '3': post = ind[tn] + "а"; break; // хх3
  74. case '4': post = ind[tn] + "а"; break; // хх4
  75. default : post = ind[tn] + "ов"; break;// хх5-хх9
  76. }
  77. }
  78. else
  79. {
  80. // случай 10-12 в двузначной части
  81. switch (tn)
  82. {
  83. case 1 : post = ind[tn]; break; // тысячи
  84. default : post = ind[tn] + "ов"; break; // миллионы и далее
  85. }
  86. }
  87. }
  88. out = out + post;
  89. return out;
  90. }
  91.  
  92. std::string summa(std::string in)
  93. {
  94. std::string out;
  95. std::string trs[5];
  96. std::string tro[5];
  97. int n;
  98.  
  99. // дополняем in в начале нулями до 15 знаков
  100. in.insert(0, 15-in.length(), ' ');
  101.  
  102. // вставляем в trs[] части строки из in
  103. trs[0].insert(trs[0].begin(), in.c_str()+12, in.c_str()+15);
  104. trs[1].insert(trs[1].begin(), in.c_str()+9, in.c_str()+12);
  105. trs[2].insert(trs[2].begin(), in.c_str()+6, in.c_str()+9);
  106. trs[3].insert(trs[3].begin(), in.c_str()+3, in.c_str()+6);
  107. trs[4].insert(trs[4].begin(), in.c_str(), in.c_str()+3);
  108.  
  109. // получаем части числа
  110. for (n=0;n<5;n++)
  111. {
  112. tro[n] = triada(trs[n], n);
  113. }
  114. // собираем число
  115. out = tro[4]+" "+tro[3]+" "+tro[2]+" "+tro[1]+" "+tro[0];
  116. return out;
  117. }
  118.  
  119. std::string tostr(long long x)
  120. {
  121. if (x==0)
  122. return "0";
  123. std::string s = "";
  124. while (x>0)
  125. {
  126. char c = x%10+'0';
  127.  
  128. s = c+s;
  129. x/=10;
  130. }
  131. return s;
  132. }
  133. int main()
  134. {
  135. freopen("input.txt","r",stdin);
  136. std::ofstream fout("output.txt");
  137. long long celaya;
  138. int kopeyki;
  139. while (scanf("%lli.%d",&celaya,&kopeyki))
  140. {
  141. std::string cel = summa(tostr(celaya));
  142.  
  143. // выставляем локаль, чтобы установить русскую кодировку
  144. setlocale(LC_ALL, "Russian");
  145. std::cout << cel << " "<< kopeyki << " копеек\n";
  146. }
  147.  
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement