Python ATM 程序未按预期运行

Python ATM program not working as intended

我正在尝试在 Python 中制作类似 ATM 的程序。这个想法是用户输入任意数量的钱,并且将打印最小数量的账单(100, 50, 25, 10, 5)。

例如:
输入: 258
预期输出:“2 张 100 美元的钞票,1 张 50 美元的钞票,1 张 5 美元的钞票,3 张 1 美元的钞票”。

该程序适用于 5 的倍数的数字,但我似乎无法让 10 美元和 1 美元的钞票表现相同。这是代码:

print("Hi! Welcome to Python Bank. \nHow much would you like to withdraw?")

amnt = int(input("Please input amount: "))

if amnt >= 100:
    if amnt // 100 >= 2:
        print(amnt // 100, "0 Bills")
    else:
        print("1 0 Bill")

if (amnt // 50) % 2 != 0:
    print("1  Bill")

if (amnt // 25) % 2 != 0:
    print("1  Bill")
    
if (amnt // 10) % 2 != 0:
    print(amnt // 10, " Bills")
    
if (amnt // 5) % 2 != 0 and (amnt // 25) % 2 == 0:
    print("1  Bill")
    
if (amnt // 1) % 2 != 1:
    print((amnt // 1), " Bills")

我正在使用 (//) 运算符,因为它会告诉您右边的数字中有多少是左边的数字。然后将 (%) 运算符与 (!= 0) 一起使用。这似乎适用于 100、50、25,但不适用于 10 和 1。我该如何解决这个问题?

我只是添加了一个 elif 来检查他们是否输入了 1,它似乎符合我的要求。

print("Hi! Welcome to Python Bank. \nHow much would you like to withdraw?")

amnt = int(input("Please input amount: "))

if amnt >= 100:
    if amnt // 100 >= 2:
        print(amnt // 100, "0 Bills")
    else:
        print("1 0 Bill")

if (amnt // 50) % 2 != 0:
    print("1  Bill")

if (amnt // 25) % 2 != 0:
    print("1  Bill")

if (amnt // 10) % 2 != 0:
    print(amnt // 10, " Bills")

if (amnt // 5) % 2 != 0 and (amnt // 25) % 2 == 0:
    print("1  Bill")

if (amnt // 1) % 2 != 1:
    print((amnt // 1), " Bills")
    
elif amnt == 1:
    print((amnt // 1), " Bills")

一个更简洁的解决方案是使用一个函数来为您执行此操作,以防万一您决定更改硬币价值。

print("Hi! Welcome to Python Bank. \nHow much would you like to withdraw?")

amnt = int(input("Please input amount: "))

def solve(m):
    bills = [100, 50, 25, 10, 5, 1]
    dic = {}
    for bill in bills:
        if m >= bill:
            dic[bill] = m // bill
            m -= dic[bill] * bill
    return dic

def disp(dic):
    s = ', '.join([ "{} ${} bills".format(dic[bill], bill) for bill in dic])
    print(s)

disp(solve(amnt))

假设你有 Python3,你可以使用 f-strings,并且你总是可以为这些事情使用循环。这样,每个账单大小的逻辑都是一致的:

def print_change(amnt, bill_sizes=(100, 50, 25, 10, 5, 1)):
    # loop over bill sizes
    for bill_size in bill_sizes:
        # skip if there isn't enough left for this bill
        if amnt >= bill_size:
            # remove n number of bills from amnt
            n = amnt // bill_size
            amnt -= n * bill_size
            # print the results, with an 's' if there are more than one
            print(f'{n} ${bill_size} Bill' + ('s' if n > 1 else ''))

print("Hi! Welcome to Python Bank. \nHow much would you like to withdraw?")
print_change(int(input("Please input amount: ")))

你的逻辑是错误的。这才是正确的做法。

if amount >= 100:
    print(amount // 100, '100$ notes')
    amount = amount % 100
if amount >= 50:
    print('1 50$ notes')
    amount = amount % 50

And so on