在给定美元数量的场景中,Python卡在硬币上

在给定美元数量的场景中,Python卡在硬币上,python,python-3.x,conditional,modulus,Python,Python 3.x,Conditional,Modulus,规格:Ubuntu 13.04,Python 3.3.1 一般背景:Python初学者 问题特定背景:我已经精疲力竭地试图解决这个问题,我知道,除了它对学习Python的指导价值外,这个问题很无聊,而且无论如何也不会让这个世界变得更好:-(因此,如果你能就这个令人筋疲力尽的问题提供一些指导,我将更加感激。但如果你对这类问题不感兴趣,我真的不想浪费你的时间 我打算做什么:“计算价值低于1美元的基本美国硬币的数量。一便士值1美分,一枚镍币值5美分,一角硬币值10美分, 四分之一值25美分。一美元需要

规格:Ubuntu 13.04,Python 3.3.1

一般背景:Python初学者

问题特定背景:我已经精疲力竭地试图解决这个问题,我知道,除了它对学习Python的指导价值外,这个问题很无聊,而且无论如何也不会让这个世界变得更好:-(因此,如果你能就这个令人筋疲力尽的问题提供一些指导,我将更加感激。但如果你对这类问题不感兴趣,我真的不想浪费你的时间

我打算做什么:“计算价值低于1美元的基本美国硬币的数量。一便士值1美分,一枚镍币值5美分,一角硬币值10美分, 四分之一值25美分。一美元需要100美分。因此,如果金额小于1美元(如果使用浮点数,则在本练习中转换为整数),计算每种类型的硬币的数量,以达到所需的数量,最大限度地增加更大面额硬币的数量。例如,给定0.76美元或76美分,正确的输出为“3个25美分和1便士”。输出如“76便士”和“2个25美分、2个10美分、1个镍币和1便士”是不可接受的

我能想到什么:

penny = 1
nickel = 5
dime = 10
quarter = 25

i = input("Please enter an amount no more than 1 dollar(in cents): ")
i = int(i)

if i > 100:
    print ("Please enter an amount equal or less than 100. ")
elif i >= quarter:
    quarter_n = i % quarter
    i = i - quarter * quarter_n
    if i >= dime:
        dime_n = i % dime
        i = i - dime * dime_n
        if i >= nickel:
            nickel_n = i % nickel
            i = i - nickel * nickel_n
            if i >= penny:
                penny_n = i % penny
                print (quarter_n,"quarters,",dime_n,"dimes",nickel_n,"nickels",penny_n,"pennies")
        else:
            if i >= penny:
                penny_n = i % penny
                print (quarter_n,"quarters,",dime_n,"dimes",penny_n,"pennies")
    else:
        if i >= nickel:
            nickel_n = i % nickel
            i = i - nickel * nickel_n
            if i >= penny:
                penny_n = i % penny
                print (quarter_n,"quarters,",nickel_n,"nickels",penny_n,"pennies")
        else:
            if i >= penny:
                penny_n = i % penny
                print (quarter_n,"quarters,",penny_n,"pennies")
else:
    if i >= dime:
        dime_n = i % dime
        i = i - dime * dime_n
        if i >= nickel:
            nickel_n = i % nickel
            i = i - nickel * nickel_n
            if i >= penny:
                penny_n = i % penny
                print (dime_n,"dimes",nickel_n,"nickels",penny_n,"pennies")
        else:
            if i >= penny:
                penny_n = i % penny
                print (dime_n,"dimes",penny_n,"pennies")
    else:
        if i >= nickel:
            nickel_n = i % nickel
            i = i - nickel * nickel_n
            if i >= penny:
                penny_n = i % penny
                print (nickel_n,"nickels",penny_n,"pennies")
        else:
            if i >= penny:
                penny_n = i % penny
                print (penny_n,"pennies")
这个解决方案,虽然是我能想到的最好的,但当输入实际的输入数字时,并不能像预期的那样工作。我也不知道为什么。此外,我知道,即使从代码的大小来看,也有问题。我搜索了类似的问题,但我得到的最接近的问题是一个我无法解决的非常难的数学问题德尔斯特恩

我的问题:我知道我不能要求一个完整的解决方案,因为这取决于我自己。我会很感激a)关于正确思路的一般性指针b)对我当前代码/思路的批评,以便我能够改进它


感谢您抽出时间,即使只是阅读这篇文章

我觉得你的算法太复杂了, 你不需要所有的elifs和Else 只需检查,如果,然后修改剩余金额,直到你得到零

像这样的

penny = 1
nickel = 5
dime = 10
quarter = 25
q = 0
d = 0
n = 0
p = 0
i = input("Please enter an amount no more than 1 dollar(in cents): ")
i = int(i)


if i>=25:
    q = i/quarter
    i %= quarter
if i>=10:
    d = i/dime
    i%=dime
if i>=5:
    n = i/nickel
    i %= nickel
if i>0:
    p = i/penny
    i = 0

print "The coins are %i quarters, %i dimes, %i nickels and %i pennys." %(q , d, n, p)

>>> 
Please enter an amount no more than 1 dollar(in cents): 99
The coins are 3 quarters, 2 dimes, 0 nickels and 4 pennys.
>>> 
Please enter an amount no more than 1 dollar(in cents): 76
The coins are 3 quarters, 0 dimes, 0 nickels and 1 pennys.

我认为,如果您对所有mod运算符
%
执行“查找并替换”,在整数除法中切换,您的解决方案实际上可能会起作用

假设您有
76
美分,并希望找到25美分的数量。使用
76%25
会导致
1
,而
76//25
则是
3

关于代码,您可能应该考虑迭代可能的硬币值,而不是一个巨大的
if
elif
混乱

试试这样的。唯一需要解释的部分是使用
divmod
,但它实际上只是整数除法、模结果的
元组。您可以使用它分别获得硬币数量和新金额

def coins_given(amount):
    coins = [(25, 'quarter'), (10, 'dime'), (5, 'nickel'), (1, 'penny')]
    answer = {}
    for coin_value, coin_name in coins:
        if amount >= coin_value:
            number_coin, amount = divmod(amount, coin_value)
            answer[coin_name] = number_coin
    return answer

print coins_given(76)
# {'quarter': 3, 'penny': 1}

你可能想把这句话转到感谢你花时间!我从你的回答中了解到,我实际上误解了
%
的含义<代码>/
产生了我真正想要的东西。谢谢你也提出了替代方案!虽然我仍然对
number\u硬币,amount=divmod(amount,coin\u value)
部分有点困惑。
divmod(金额、硬币价值)
是否等于
amount//coin\u value
产生的价值?或者它只是把整数除法的结果和它的余数作为一对元组放在左边?
divmod(76,25)=(76//25,76%25)=(3,1)
这真的只是一个快捷方式。如果我想,我会在这段代码中添加什么?例如,如果输入是138,那么输出应该是[5;1;0;3],表示5个四分之一,1个一角,0个五分镍币和3个便士。谢谢!一个优雅的解决方案!虽然我还不熟悉字符串格式。我肯定会把这个留到以后研究:-)没什么,伙计,@jared是一个优雅的、更具Python风格的解决方案。我的是一个更简单的算法方法。字符串格式真的很有帮助,我相信当你熟悉它时你会很感激的。
dime=10
nickel=5
penny=1
quarter=25

def change(cents):
    changeIs = ""
    qs = cents/quarter
    cents %= quarter
    if qs > 0 :
        changeIs += str(qs) + " quarter(s)"
    ds = cents/dime
    cents %= dime
    if ds > 0 :
        changeIs += " " + str(ds) + " dime(s)"
    ns = cents/nickel
    cents %= nickel
    if ns > 0 :
        changeIs +=  " " + str(ns) + " nickel(s)"
    if cents > 0 :
        changeIs +=  " " + str(cents) + " cent(s)"
    return changeIs

if __name__ == '__main__':
    cents=int(raw_input("Enter the change: "))
    print change(cents)