Python找零问题

img

完全不懂(=_=),有无人教教我,万分感谢!!能告诉我每个代码的意思最好

题目给的输入输出例子的格式看一下

from random import *

def makechange(num):
    changes = {}
    numint = int(num)
    numdec = round(num - numint, 2)

    Coins = [50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01] # 创建可用的货币面值列表
    i = 0
    for n in (numint, numdec):
        while n > 0: # 如果剩下的钱大于0,就一直减去最大的可用货币
            if n >= Coins[i]:
                changes[Coins[i]] = changes.get(Coins[i], 0) + 1 # 更新字典,使用货币数量加一
                n = round(n - Coins[i], 2) # 不断用当前面值的货币找零,剩下的钱继续
            else:
                i += 1 # 如果当前货币面值比剩下的钱少,就检查列表里下一个货币
        else:
            i = 6 # 整数部分找完,跳到小数部分的货币列表
    return changes

if __name__ == "__main__":
    seed(0)
    for i in range(10):
        num = round(random() * 100, 2)
        print(sorted(makechange(num).items(), key=lambda item: item[0], reverse=True))
def makechange(num):
    changes = {}
    numint = int(num)
    numdec = round(num - numint, 2)

    while numint > 0:
        if numint >= 50:
            changes["50元"] = changes.get("50元", 0) + 1
            numint -= 50
        elif numint >= 20:
            changes["20元"] = changes.get("20元", 0) + 1
            numint -= 20
        elif numint >= 10:
            changes["10元"] = changes.get("10元", 0) + 1
            numint -= 10
        elif numint >= 5:
            changes["5元"] = changes.get("5元", 0) + 1
            numint -= 5
        elif numint >= 2:
            changes["2元"] = changes.get("2元", 0) + 1
            numint -= 2
        elif numint >= 1:
            changes["1元"] = changes.get("1元", 0) + 1
            numint -= 1

    while numdec > 0:
        if numdec >= 0.5:
            changes["5角"] = changes.get("5角", 0) + 1
            numdec -= 0.5
        elif numdec >= 0.2:
            changes["2角"] = changes.get("2角", 0) + 1
            numdec -= 0.2
        elif numdec >= 0.1:
            changes["1角"] = changes.get("1角", 0) + 1
            numdec -= 0.1
        elif numdec >= 0.05:
            changes["5分"] = changes.get("5分", 0) + 1
            numdec -= 0.05
        elif numdec >= 0.02:
            changes["2分"] = changes.get("2分", 0) + 1
            numdec -= 0.02
        elif numdec >= 0.01:
            changes["1分"] = changes.get("1分", 0) + 1
            numdec -= 0.01

    return changes

程序填空,固化 了思路
from random import *

def makechange(num):
    changes = {}
    numint = int(num)
    numdec = round(num - numint, 2)
    l = {5000:'50元', 2000:'20元', 1000:'10元', 500:'5元', 200:'2元', 100:'1元', 50:'5角', 20:'2角', 10:'1角', 5:'5分', 2:'2分', 1:'1分'}
    
    numint_ = int((numint + numdec) * 100)
    for i in l:
        x, y = divmod(numint_, i)
        if x > 0: changes[i] = x
        numint_ = y
        
    return changes

if __name__ == "__main__":
    seed(0)
    for i in range(10):
        num = round(random() *100, 2)
        print(num, '元')
        print(sorted(makechange(num).items(), key = lambda item: item[0], reverse = True))

先给您注释,您图中的每条语句。


#!/usr/bin/nve python
# coding: utf-8

from random import * # 在实际编程中一般不会使用这种载入所有方法的方式,用到具体方法则载入具体方法,更“经济”。


def makechange(num):
    ''' 找出给出金额的钱币张数组合 '''
    print(f"\n{num}元:", end='')
    changes = {} # 钱币组合字典。
    numint = int(num) # 输入金额整数部分。
    numdec = round(num-numint, 2) # 输入金额小数部分。

    # 请在此添加代码,补全makechange
    # -----------Begin-------------

    ch = changes # 给钱币组合字典取别名,简化代码书写。
    yuan = [50, 20, 10, 5, 2, 1]
    jiao = [5, 2, 1]
    fen = [5, 2, 1] # yuan、jiao、fen为币值。
 
    # 依次轮询找出各种币值钱币张数
    for y in yuan: # 找元币。
        if numint <= 0: break
        #print(numint, y, numint//y)
        if (other := numint//y): # 海象运算符赋值,方便后续代码引用。
            ch[f"{y}元"] = round(other) # 张币值张数存入字典。
            numint -= other*y # 减去已找币值金额。

    numdec *= 10 # 化小数为角。
    for j in jiao:
        if numdec <= 0: break
        #print(numdec, j, numdec//j)
        if (other := numdec//j):
            ch[f"{j}角"] = round(other)
            numdec -= other*j

    numdec *= 10 # 化小数为分。
    for f in fen:
        if numdec <= 0: break 
        #print(numdec, f, numdec//f)
        if int(other := numdec//f):
            ch[f"{f}分"] = round(other)
            numdec -= other*f 

# -----------End----------------

    return changes # 返回钱币组合字典
if __name__ == '__main__': # 直接执行本*.py文件,才执行后面的代码。
    seed(0) # 设置随机数种子,让产生的随机数有稳定值。
    for i in range(10): # 轮询10次。
        num = round(random()*100, 2) # 随机生成100以内的两位小数。
        print(sorted(list(makechange(num).items()), key=lambda item: item[0][-1], reverse=True)) # 输出以钱币种类排序的钱币张数组合。

img

您的最后一行看不全,也许不是我这样子的输出。


“填空”,禁锢了“算法”。本问题解法,还可优化。

#!/usr/bin/nve python
# coding: utf-8

from random import * # 在实际编程中一般不会使用这种载入所有方法的方式,用到具体方法则载入具体方法,更“经济”。


def makechange(num):
    ''' 找出给出金额的钱币张数组合 '''
    print(f"\n{num}", end='元:')
    changes = {} # 钱币组合字典。
    money = [50, 20, 10, 5, 2, 1,
            0.5, 0.2, 0.1,
            0.05, 0.02, 0.01] # 币值列表。
    flag = '' # 钱币单位初值。
    for i in money: # 找币。
        #print(f"{i}, {round(num,2)}, {round(num//i)}")

        if i >= 1:
            i_s = i
            flag = '元'
        elif i >= 0.1:
            i_s = round(i*10)
            flag = '角'
        elif i >= 0.01:
            i_s = round(i*100)
            flag = '分'

        if num-num%i:
            if num<0.01:
                changes[f"{i_s}{flag}"] = round(round((num - num%i), 2)/i)
            else:
                changes[f"{i_s}{flag}"] = round((num - num%i)/i)
            num = num%i

        if num <= 0:
            break

    return changes # 返回钱币组合字典

if __name__ == '__main__': # 直接执行本*.py文件,才执行后面的代码。
    seed(0) # 设置随机数种子。
    for i in range(10): # 轮询10次。
        num = round(random()*100, 2) # 随机生成100以内的两位小数。
        print(sorted(list(makechange(num).items()), key=lambda item: item[0][-1], reverse=False)) # 输出以钱币种类排序的钱币张数组合。

img


对您有帮助,请点击左边
“采纳该答案”