Advertisement
Guest User

Untitled

a guest
Jan 10th, 2020
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.45 KB | None | 0 0
  1. <?php
  2.  
  3. $amount = 56000;
  4.  
  5. $bills = [
  6.     100  => 23,
  7.     500  => 5,
  8.     1000 => 0,
  9.     5000 => 10
  10. ];
  11.  
  12. echo "Сумма: $amount\n";
  13.  
  14. if ($amount <= 0) echo "Выдача невозможна, сумма слишком мала\n";
  15.  
  16. $remainder = $amount % key($bills);
  17. if ($remainder != 0) echo "Выдача невозможна, нет купюр чтобы выдать $remainder\n";
  18.  
  19. krsort($bills);
  20.  
  21. echo "Купюр в банкомате:\n";
  22. print_r($bills);
  23.  
  24. $output = '';
  25. $change_possible = false;
  26. $ret = change($amount, $bills, $bills, $output, $change_possible);
  27.  
  28. if ($change_possible) echo "Выдача возможна: $output\n";
  29. else echo "Выдача невозможна, в банкомате не хватает денег чтобы выдать $ret\n";
  30.  
  31. echo "Купюр в банкомате:\n";
  32. print_r($ret);
  33.  
  34. function change($amount, $bills, $new_bills, &$output, &$change_possible) {
  35.  
  36.     if (count($bills) <= 0) { // Купюры кончились
  37.  
  38.         if ($amount > 0) { // Купюры кончились, но ещё не вся сумма выдана
  39.             $change_possible = false;
  40.             return $amount;
  41.         } else { // Купюры кончились и вся сумма выдана
  42.             return $new_bills;
  43.         }
  44.     }
  45.  
  46.     $bill_count = reset($bills);    // Количество купюр номинала
  47.     $bill_value = key($bills);      // Номинал купюр
  48.     unset($bills[$bill_value]);
  49.  
  50.     // Если купюры данного номинала закончились
  51.     if ($bill_count == 0) return change($amount, $bills, $new_bills, $output, $change_possible);
  52.  
  53.     $whole = intdiv($amount, $bill_value);
  54.  
  55.     if ($whole > 0) { // Чё-то можем выдать купюрами данного номинала
  56.  
  57.         // Нельзя выдать больше купюр, чем есть
  58.         if ($whole > $bill_count) $whole = $bill_count;
  59.  
  60.         $new_bills[$bill_value] -= $whole;
  61.         $amount -= $whole * $bill_value;
  62.  
  63.         $output .= "{$whole}x{$bill_value} ";
  64.  
  65.         $change_possible = true;
  66.         return change($amount, $bills, $new_bills, $output, $change_possible);
  67.  
  68.     } else { // Ниче не можем выдать купюрами данного номинала
  69.  
  70.         $remainder = $amount % $bill_value;
  71.  
  72.         return change($remainder, $bills, $new_bills, $output, $change_possible);
  73.     }
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement