Программа-банкомат для выдачи любой суммы при помощи минимального числа банкнот

В современном мире банкоматы являются неотъемлемой частью нашей финансовой жизни. Они обеспечивают удобный доступ к нашим деньгам, позволяя снимать наличные, проверять баланс и выполнять другие банковские операции. Однако создание банкомата, способного выдавать любую сумму с минимальным количеством банкнот, представляет собой интересное исследование в области программирования. В данной статье мы рассмотрим создание программы-банкомата для выдачи суммы при помощи минимального числа банкнот.

Теория

Жадный алгоритм — это подход в алгоритмическом проектировании, который заключается в выборе наилучшей (локально оптимальной) стратегии на каждом шаге с тем, чтобы достичь глобальной оптимальности. В случае программы банкомата для выдачи любой суммы с минимальным числом банкнот, жадный алгоритм применяется для определения оптимальной комбинации номиналов банкнот на каждом шаге выдачи.

Основная идея жадного алгоритма для банкомата заключается в следующих шагах:

  • Сначала определите доступные номиналы банкнот, которыми располагает банкомат. Эти номиналы обычно задаются в коде программы.
  • Пользователь вводит сумму, которую он хочет снять с банкомата.
  • Начните с самого крупного номинала банкноты и проверьте, сколько таких банкнот может быть использовано без превышения запрошенной суммы. Если возможно, выдайте максимальное количество банкнот данного номинала.
  • Перейдите к следующему меньшему номиналу банкноты и повторите шаг 3.
  • Продолжайте этот процесс до тех пор, пока не будет выдана вся запрошенная сумма или до тех пор, пока невозможно выдать больше банкнот данного номинала без превышения суммы.
  • Если после завершения алгоритма осталась невыданной сумма, то выдача с указанной суммой невозможна.

Этот метод обеспечивает минимизацию количества выданных банкнот и, следовательно, экономичное использование денежных ресурсов. Жадный алгоритм подходит для задачи выдачи наличных денег через банкомат, так как на каждом шаге выбирается наибольший доступный номинал, что помогает сократить общее количество банкнот.

C++

Программа для банкомата, которая выдает любую сумму с использованием минимального количества банкнот, может быть реализована на C++ с помощью жадного алгоритма. Пример такой программы:

#include <iostream>
#include <vector>

// Функция для выдачи суммы минимальным количеством банкнот
std::vector<int> withdrawCash(int amount) {
    std::vector<int> denominations = {100, 50, 20, 10, 5, 1};  // Доступные номиналы банкнот
    std::vector<int> withdrawal(denominations.size(), 0);  // Вектор для хранения количества каждой банкноты

    for (int i = 0; i < denominations.size(); i++) {
        while (amount >= denominations[i]) {
            withdrawal[i]++;
            amount -= denominations[i];
        }
    }

    if (amount == 0) {
        return withdrawal;
    } else {
        std::vector<int> emptyResult;
        return emptyResult;  // Невозможно выдать указанную сумму
    }
}

int main() {
    int amount;
    std::cout << "Введите сумму для снятия: ";
    std::cin >> amount;

    std::vector<int> result = withdrawCash(amount);

    if (result.empty()) {
        std::cout << "Невозможно выдать указанную сумму банкнотами в наличии." << std::endl;
    } else {
        std::cout << "Выдать следующие банкноты:" << std::endl;
        std::vector<int> denominations = {100, 50, 20, 10, 5, 1};
        for (int i = 0; i < result.size(); i++) {
            if (result[i] > 0) {
                std::cout << denominations[i] << " рублей: " << result[i] << " банкнот" << std::endl;
            }
        }
    }

    return 0;
}

В этой программе мы используем жадный алгоритм для определения минимального количества банкнот, необходимых для выдачи указанной суммы. Пользователь вводит желаемую сумму, и программа выводит количество и номиналы банкнот, необходимых для выдачи этой суммы, либо сообщает, что выдача с указанной суммой невозможна.

C#

using System;
using System.Collections.Generic;

class Program
{
    static List<int> WithdrawCash(int amount)
    {
        int[] denominations = { 100, 50, 20, 10, 5, 1 };
        List<int> withdrawal = new List<int>(denominations.Length);

        foreach (int denomination in denominations)
        {
            int count = amount / denomination;
            withdrawal.Add(count);
            amount -= count * denomination;
        }

        if (amount == 0)
            return withdrawal;
        else
            return null; // Невозможно выдать указанную сумму
    }

    static void Main(string[] args)
    {
        Console.Write("Введите сумму для снятия: ");
        int amount = int.Parse(Console.ReadLine());

        List<int> result = WithdrawCash(amount);

        if (result == null)
        {
            Console.WriteLine("Невозможно выдать указанную сумму банкнотами в наличии.");
        }
        else
        {
            Console.WriteLine("Выдать следующие банкноты:");
            int[] denominations = { 100, 50, 20, 10, 5, 1 };
            for (int i = 0; i < result.Count; i++)
            {
                if (result[i] > 0)
                {
                    Console.WriteLine($"{denominations[i]} рублей: {result[i]} банкнот");
                }
            }
        }
    }
}

Python

Программа для банкомата, которая выдает любую сумму при помощи минимального числа банкнот, может быть реализована с использованием жадного алгоритма. В жадном алгоритме на каждом шаге выбирается наибольшая доступная банкнота, которая помещается в запрашиваемую сумму, и процесс повторяется до тех пор, пока сумма не достигнет нуля. Вот пример программы на Python, которая демонстрирует этот алгоритм:

def withdraw(amount):
    denominations = [100, 50, 20, 10, 5, 1]  # Доступные номиналы банкнот
    withdrawal = {}  # Словарь для хранения результатов (количество каждой банкноты)

    for denomination in denominations:
        count = amount // denomination  # Количество банкнот данного номинала
        if count > 0:
            withdrawal[denomination] = count
            amount -= count * denomination

    if amount == 0:
        return withdrawal
    else:
        return None  # Невозможно выдать указанную сумму

# Ввод суммы
amount = int(input("Введите сумму для снятия: "))

result = withdraw(amount)
if result:
    print("Выдать следующие банкноты:")
    for denomination, count in result.items():
        print(f"{denomination} рублей: {count} банкнот")
else:
    print("Невозможно выдать указанную сумму банкнотами в наличии.")

Java

import java.util.ArrayList;
import java.util.List;

public class ATM {
    public static List<Integer> withdrawCash(int amount) {
        int[] denominations = {100, 50, 20, 10, 5, 1};
        List<Integer> withdrawal = new ArrayList<>(denominations.length);

        for (int denomination : denominations) {
            int count = amount / denomination;
            withdrawal.add(count);
            amount -= count * denomination;
        }

        if (amount == 0) {
            return withdrawal;
        } else {
            return null; // Невозможно выдать указанную сумму
        }
    }

    public static void main(String[] args) {
        System.out.print("Введите сумму для снятия: ");
        int amount = new java.util.Scanner(System.in).nextInt();

        List<Integer> result = withdrawCash(amount);

        if (result == null) {
            System.out.println("Невозможно выдать указанную сумму банкнотами в наличии.");
        } else {
            System.out.println("Выдать следующие банкноты:");
            int[] denominations = {100, 50, 20, 10, 5, 1};
            for (int i = 0; i < result.size(); i++) {
                if (result.get(i) > 0) {
                    System.out.println(denominations[i] + " рублей: " + result.get(i) + " банкнот");
                }
            }
        }
    }
}

Pascal

program ATM;

var
  amount: Integer;
  denominations: array [0..5] of Integer;
  withdrawal: array [0..5] of Integer;
  i: Integer;

begin
  denominations[0] := 100;
  denominations[1] := 50;
  denominations[2] := 20;
  denominations[3] := 10;
  denominations[4] := 5;
  denominations[5] := 1;

  writeln('Введите сумму для снятия: ');
  readln(amount);

  for i := 0 to 5 do
  begin
    withdrawal[i] := amount div denominations[i];
    amount := amount - withdrawal[i] * denominations[i];
  end;

  if amount = 0 then
  begin
    writeln('Выдать следующие банкноты:');
    for i := 0 to 5 do
    begin
      if withdrawal[i] > 0 then
        writeln(denominations[i], ' рублей: ', withdrawal[i], ' банкнот');
    end;
  end
  else
  begin
    writeln('Невозможно выдать указанную сумму банкнотами в наличии.');
  end;
end.

JavaScript

JavaScript не предоставляет стандартных средств для ввода данных с клавиатуры, поэтому в браузерной среде или среде выполнения Node.js ввод с клавиатуры может быть ограничен. Однако вы можете создать интерфейс веб-приложения для ввода суммы и выдачи банкнот с использованием JavaScript. Пример веб-приложения, которое реализует банкомат:

<!DOCTYPE html>
<html>
<head>
    <title>Банкомат</title>
</head>
<body>
    <h1>Банкомат</h1>
    <p>Введите сумму для снятия:</p>
    <input type="number" id="amountInput">
    <button onclick="withdrawCash()">Снять</button>
    <div id="result"></div>

    <script>
        function withdrawCash() {
            const amount = parseInt(document.getElementById("amountInput").value);
            const denominations = [100, 50, 20, 10, 5, 1];
            const withdrawal = [];

            for (const denomination of denominations) {
                const count = Math.floor(amount / denomination);
                withdrawal.push(count);
                amount -= count * denomination;
            }

            if (amount === 0) {
                let resultText = "Выдать следующие банкноты:<br>";
                for (let i = 0; i < denominations.length; i++) {
                    if (withdrawal[i] > 0) {
                        resultText += denominations[i] + " рублей: " + withdrawal[i] + " банкнот<br>";
                    }
                }
                document.getElementById("result").innerHTML = resultText;
            } else {
                document.getElementById("result").innerHTML = "Невозможно выдать указанную сумму банкнотами в наличии.";
            }
        }
    </script>
</body>
</html>

В этом примере создается простое веб-приложение, где пользователь вводит сумму для снятия, а затем нажимает кнопку «Снять», чтобы получить результат выдачи банкнот. JavaScript вычисляет минимальное количество банкнот для выдачи и отображает результат на веб-странице.

PHP

<!DOCTYPE html>
<html>
<head>
    <title>Банкомат</title>
</head>
<body>
    <h1>Банкомат</h1>
    <p>Введите сумму для снятия:</p>
    <form method="post" action="">
        <input type="number" name="amount">
        <input type="submit" value="Снять">
    </form>
    
    <?php
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        $amount = $_POST["amount"];
        $denominations = [100, 50, 20, 10, 5, 1];
        $withdrawal = array();

        foreach ($denominations as $denomination) {
            $count = intdiv($amount, $denomination);
            $withdrawal[$denomination] = $count;
            $amount -= $count * $denomination;
        }

        if ($amount === 0) {
            echo "<p>Выдать следующие банкноты:</p>";
            foreach ($denominations as $denomination) {
                if ($withdrawal[$denomination] > 0) {
                    echo $denomination . " рублей: " . $withdrawal[$denomination] . " банкнот<br>";
                }
            }
        } else {
            echo "<p>Невозможно выдать указанную сумму банкнотами в наличии.</p>";
        }
    }
    ?>
</body>
</html>

В этой программе создается простая веб-страница, где пользователь может ввести сумму для снятия и нажать кнопку «Снять». PHP обрабатывает ввод пользователя, вычисляет минимальное количество банкнот для выдачи, и выводит результат на веб-странице.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...
Давайте поможем друг другу! Если вы нашли ошибку или хотите предложить лучшее решение, пожалуйста, напишите об этом в комментариях.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *