fork(1) download
  1. //Выдасть сдачу, если возможно. В банкомате есть определённый запас купюр, номиналом: 100, 500, 1000, 5000
  2. //Нужно использовать наименьшее число купюр.
  3. <?php
  4. function examination (int $usersMoney, array $moneyATM) : bool
  5. {//Проверяет, может ли банкомат выдасть купюры, и если не может, выводит причину
  6. if ($usersMoney % 100 != 0){
  7. echo "Выдача невозможна: введённая сумма $usersMoney не кратна 100.";
  8. return false;
  9. }
  10. if(!checkATM($moneyATM)){
  11. echo "Выдача невозможна: в банкомате нет денег.";
  12. return false;
  13. }
  14. if(!checkSum($moneyATM, $usersMoney)){
  15. echo "Выдача невозможна: в банкомате недостаточно денег.";
  16. return false;
  17. }
  18. if($usersMoney <= 0){
  19. echo "Выдача невозможна: введённая сумма меньше или равна 0.";
  20. return false;
  21. }
  22. return true;
  23. }
  24. function integer(int $usersMoney, int $divider, int $factor) : int
  25. {//Возвращает максимальное число купюр
  26. return intval(floor($usersMoney / $divider)) * $factor;
  27. }
  28. function currency(int $usersMoney, array $moneyATM) : array
  29. {//Считает необходимое количество купюр
  30. $paper = [
  31. 100 => 0,
  32. 500 => 0,
  33. 1000 => 0,
  34. 5000 => 0
  35. ];
  36. for($i = 3; $i >= 0; $i--){//Проверяет, есть ли в банкомате нужные купюры
  37. $keys = array_keys($paper);
  38. $paper[$keys[$i]] = integer($usersMoney, $keys[$i], 1);
  39. if($moneyATM[$keys[$i]] >= $paper[$keys[$i]]){
  40. $usersMoney -= integer($usersMoney, $keys[$i], $keys[$i]);
  41. } elseif($moneyATM[$keys[$i]] != 0){
  42. $usersMoney -= $moneyATM[$keys[$i]] * $keys[$i];
  43. $paper[$keys[$i]] = $moneyATM[$keys[$i]];
  44. } else{
  45. $paper[$keys[$i]] = 0;
  46. }
  47. }
  48. return $paper;
  49. }
  50.  
  51. function checkATM(array $moneyATM) : bool
  52. {//Проверяет, есть ли купюры в банкомате
  53. $i = 0;
  54. foreach ($moneyATM as $money) {
  55. if ($money == 0) {
  56. $i++;
  57. }
  58. }
  59. return $i != 4 ? true : false;
  60. }
  61.  
  62. function checkSum(array $moneyATM, float $sum) : bool
  63. {//Больше ли введённая сумма, чем есть денег в банкомате
  64. $sumInATM = 0;
  65. foreach ($moneyATM as $currency => $amount) {
  66. $sumInATM += $currency * $amount;
  67. }
  68. return (($sumInATM - $sum) >= 0) ? true : false;
  69. }
  70.  
  71. $usersMoney = 2500;
  72. $moneyATM = [
  73. 100 => 1,
  74. 500 => 1,
  75. 1000 => 1,
  76. 5000 => 10
  77. ];
  78. if (examination($usersMoney, $moneyATM)) {
  79. $result = currency($usersMoney, $moneyATM);
  80. foreach ($result as $currency => $amount) {
  81. echo $currency . " => " . $amount . "\n";
  82. }
  83. }
  84. ?>
Success #stdin #stdout 0.01s 82560KB
stdin
Standard input is empty
stdout
//Выдасть сдачу, если возможно. В банкомате есть определённый запас купюр, номиналом: 100, 500, 1000, 5000
//Нужно использовать наименьшее число купюр.
100 => 1
500 => 1
1000 => 1
5000 => 0