fork(35) download
  1. <?php
  2. /*
  3.   Задача: Дана сумма, находящаяся в банке на счету, в рублях. Вывести ее в текстовом виде вроде "шестнадцать миллионов десять тысяч три (16010003) рубля".
  4.  
  5.   Решал: с 2.09.16 по 3.09.16
  6.   */
  7.  
  8. header('Content-Type: text/html; charset=utf-8');
  9.  
  10. function spellSmallNumber($number, $isFemale)
  11. {
  12. $result = array();
  13.  
  14. $spelling = array(
  15. 0 => 'ноль', 1 => 'один', 2 => 'два',
  16. 3 => 'три', 4 => 'четыре', 5 => 'пять',
  17. 6 => 'шесть', 7 => 'семь', 8 => 'восемь',
  18. 9 => 'девять', 10 => 'десять', 11 => 'одиннадцать',
  19. 12 => 'двенадцать', 13 => 'тринадцать', 14 => 'четырнадцать',
  20. 15 => 'пятнадцать', 16 => 'шестнадцать', 17 => 'семнадцать',
  21. 18 => 'восемнадцать', 19 => 'девятнадцать', 20 => 'двадцать',
  22. 30 => 'тридцать', 40 => 'сорок', 50 => 'пятьдесят',
  23. 60 => 'шестьдесят', 70 => 'семьдесят', 80 => 'восемьдесят',
  24. 90 => 'девяносто', 100 => 'сто', 200 => 'двести',
  25. 300 => 'триста', 400 => 'четыреста', 500 => 'пятьсот',
  26. 600 => 'шестьсот', 700 => 'семьсот', 800 => 'восемьсот',
  27. 900 => 'девятсот'
  28. );
  29.  
  30. $femaleSpelling = array(
  31. 1 => 'одна', 2 => 'две'
  32. );
  33.  
  34. if ($number == 0) {
  35. $result[] = $spelling[$number];
  36. }
  37.  
  38. $hundreds = floor($number / 100) * 100;
  39. if ($hundreds != 0) {
  40. $result[] = $spelling[$hundreds];
  41. }
  42.  
  43. $lastTwoDigit = $number % 100;
  44. if (($lastTwoDigit >= 11 && $lastTwoDigit <= 20) || (($lastTwoDigit % 10 == 0) && $lastTwoDigit != 0)) {
  45. $result[] = $spelling[$lastTwoDigit];
  46. } else {
  47. $tens = floor($lastTwoDigit / 10) * 10;
  48.  
  49. if ($tens != 0) {
  50. $result[] = $spelling[$tens];
  51. }
  52.  
  53. $units = $lastTwoDigit % 10;
  54.  
  55. if ($units != 0) {
  56. if ($isFemale && ($units == 1 || $units == 2)) {
  57. $result[] = $femaleSpelling[$units];
  58. } else {
  59. $result[] = $spelling[$units];
  60. }
  61. }
  62. }
  63.  
  64. $text = implode(' ', $result);
  65. return $text;
  66. }
  67.  
  68. function inclineWord($number, $word1, $word2, $word5)
  69. {
  70. $lastTwoDigit = $number % 100;
  71.  
  72. if ($lastTwoDigit >= 11 && $lastTwoDigit <= 14) {
  73. return $word5;
  74. } elseif ($lastTwoDigit % 10 == 1) {
  75. return $word1;
  76. } elseif ($lastTwoDigit % 10 >= 2 && $lastTwoDigit % 10 <= 4) {
  77. return $word2;
  78. } else {
  79. return $word5;
  80. }
  81. }
  82.  
  83. function numberToText($number)
  84. {
  85. $result = '';
  86.  
  87. $numberClass = array(
  88. 0 => array('', '', ''),
  89. 1 => array(' тысяча ', ' тысячи ', ' тысяч '),
  90. 2 => array(' миллион ', ' миллиона ', ' миллионов ')
  91. );
  92.  
  93. $workNumber = $number;
  94. $numberArray = array();
  95.  
  96. while ($workNumber > 999) {
  97. $numberArray[] = $workNumber % 1000;
  98. $workNumber = (int) floor($workNumber / 1000);
  99. }
  100. $numberArray[] = $workNumber;
  101.  
  102. for ($i = count($numberArray) - 1; $i >= 0; $i--) {
  103. if ($i == 1) {
  104. $isFemale = 1;
  105. } else {
  106. $isFemale = 0;
  107. }
  108. if (count($numberArray) > 1 && $numberArray[$i] == 0) {
  109. continue;
  110. }
  111. $result .= spellSmallNumber($numberArray[$i], $isFemale) . inclineWord($numberArray[$i], $numberClass[$i][0], $numberClass[$i][1], $numberClass[$i][2]);
  112. }
  113.  
  114. $result = $result . " ($number) " . inclineWord($number, 'рубль', 'рубля', 'рублей');
  115. return $result;
  116. }
  117.  
  118. $number = mt_rand(0, 999999999);
  119. $result = numberToText($number);
  120. echo "На вашем счету: $result\n";
  121.  
  122. $number = mt_rand(0, 99999999);
  123. $result = numberToText($number);
  124. echo "На вашем счету: $result\n";
  125.  
  126. $number = mt_rand(0, 9999999);
  127. $result = numberToText($number);
  128. echo "На вашем счету: $result\n";
  129.  
  130. $number = mt_rand(0, 9999999);
  131. $result = numberToText($number);
  132. echo "На вашем счету: $result\n";
  133.  
  134. $number = mt_rand(0, 999999);
  135. $result = numberToText($number);
  136. echo "На вашем счету: $result\n";
Success #stdin #stdout 0.01s 52488KB
stdin
Standard input is empty
stdout
На вашем счету: сто тридцать миллионов пятьсот девяносто одна тысяча шестьсот сорок пять (130591645) рублей
На вашем счету: восемьдесят девять миллионов семьсот восемьдесят пять тысяч девятсот девяносто восемь (89785998) рублей
На вашем счету: один миллион шестьсот тридцать шесть тысяч девяносто (1636090) рублей
На вашем счету: девять миллионов восемьсот девяносто две тысячи девятсот пятьдесят два (9892952) рубля
На вашем счету: семьсот шестьдесят пять тысяч семьсот семьдесят пять (765775) рублей