2009-03-07 4 views
-2

Ich bin auf der Suche nach der effizienteste Möglichkeit, eine Änderung Menge (Viertel, Groschen, Nickel und Pennies) aus einem Kaufbetrag herauszufinden. Der Kaufbetrag muss weniger als 1 US-Dollar betragen und die Änderung beträgt 1 US-Dollar. Ich muss wissen, wie viele Viertel, Groschen, Nickel und Pennies jemand zurückbekommen würde.Python-Funktion: Suche Änderung von Kaufbetrag

Wäre es am besten, ein Wörterbuch einzurichten?

+0

HFG Frage markiert? – alexpopescu

+0

Ja, das ist ein Hausaufgabenproblem, aber was ich versuche zu finden, ist die effizienteste Methode. Es scheint, dass jeder für die Rekursionsmethode stimmt, was von dem, was ich verstehe, viel prozesshungriger ist als eine Schleifenmethode. –

+0

Prozess hungrig? Mit wievielen Münzen arbeiten Sie zusammen? –

Antwort

0

Ihre beste Wette ist wahrscheinlich ein sortiertes Wörterbuch von Münzgrößen haben, und dann der Schleife durch sie zu überprüfen, ob Ihre Änderung größer als der Wert ist, dass die Münze hinzufügen und den Wert abziehen, sonst entlang in der nächsten Zeile in der Bewegung Wörterbuch.

Eg

Coins = [50, 25, 10, 5, 2, 1] 
ChangeDue = 87 
CoinsReturned = [] 
For I in coins: 
    While I >= ChangeDue: 
     CoinsReturned.add(I) 
     ChangeDue = ChangeDue - I 

es meine lausigen Python Syntax vergeben. Hoffe, das ist genug, um weiterzumachen.

+0

sollte sein, während ich> = changeDue – Triptych

+0

So sollte es. Danke für das Triptychon –

+0

Es gibt auch keine .add zu einer Liste. Es wäre CoinsReturned.append (i) –

7

Gee, du meinst das ist kein Problem 2b in jedem Programmierkurs mehr? Äh, wahrscheinlich nicht, sie scheinen den Leuten auch nicht beizubringen, wie sie Veränderungen vornehmen können. (Oder vielleicht tun sie: ist das eine Hausaufgabe?)

Wenn Sie jemanden über 50 finden und sie für Sie ändern lassen, funktioniert es so. Nehmen wir an, Sie haben einen Scheck über 3,52 $ und Sie geben dem Kassierer eine Twenty. Sie werden Änderung vornehmen, indem er „drei zweiundfünfzig“ dann

  • Zählung zurück drei Pfennige, sagte „drei, vier, fünf“ (3,55)
  • Zählung zurück 2 Nickels, (3,60, 3,65)
  • Zählung wieder einen Cent (3,75)
  • ein Viertel (4 Dollar)
  • einen Dollarschein (fünf Dollar)
  • eine Rechnung $ 5 (zehn Dollar)
  • 10 Rechnung $ (zwanzig).

Das ist im Grunde ein rekursiver Prozess: Sie zählen den aktuellen Nennwert zurück, bis der aktuelle Betrag plus der nächste Nennwert sogar ausgegeben wird. Gehe dann zum nächsten Nennwert.

Sie können es natürlich iterativ tun, wie oben.

4

Dies ist wahrscheinlich ziemlich schnell - nur wenige Operationen pro Stückelung:

def change(amount): 
    money =() 
    for coin in [25,10,5,1] 
     num = amount/coin 
     money += (coin,) * num 
     amount -= coin * num 

    return money 
0

Dieses Problem mit Integer-Partitionen aus der Zahlentheorie recht einfach gelöst werden könnte. Ich habe eine rekursive Funktion geschrieben, die eine Zahl und eine Liste von Partitionen annimmt und die Anzahl der möglichen Kombinationen zurückgibt, aus denen die angegebene Zahl besteht.

http://sandboxrichard.blogspot.com/2009/03/integer-partitions-and-wiki-smarts.html

Es ist nicht genau das, was Sie wollen, aber es leicht modifiziert werden könnte, Ihr Ergebnis zu erhalten.

+0

ziemlich sicher, es ist nicht was OP sucht: der Link ist 404. –

0

Die obige Lösung funktioniert.

amount=int(input("Please enter amount in pence")) 
coins = [50, 25, 10, 5, 2, 1] 
coinsReturned = [] 
for i in coins: 
    while amount >=i: 
     coinsReturned.append(i) 
     amount = amount - i 
print(coinsReturned) 

Alternativ kann eine Lösung mit den Funktionen floor und mod erreicht werden.

amount = int(input("Please enter amount in pence")) 
# math floor of 50 
fifty = amount // 50 
# mod of 50 and floor of 20 
twenty = amount % 50 // 20 
# mod of 50 and 20 and floor of 10 
ten = amount % 50 % 20 // 10 
# mod of 50 , 20 and 10 and floor of 5 
five = amount % 50 % 20 % 10 // 5 
# mod of 50 , 20 , 10 and 5 and floor of 2 
two = amount % 50 % 20 % 10 % 5 // 2 
# mod of 50 , 20 , 10 , 5 and 2 and floor of 1 
one = amount % 50 % 20 % 10 % 5 % 2 //1 

print("50p>>> " , fifty , " 20p>>> " , twenty , " 10p>>> " , ten , " 5p>>> " , five , " 2p>>> " , two , " 1p>>> " , one) 

Oder eine andere Lösung

amount=int(input("Please enter the change to be given")) 
endAmount=amount 

coins=[50,25,10,5,2,1] 
listOfCoins=["fifty" ,"twenty five", "ten", "five", "two" , "one"] 
change = [] 

for coin in coins: 
    holdingAmount=amount 
    amount=amount//coin 
    change.append(amount) 
    amount=holdingAmount%coin 

print("The minimum coinage to return from " ,endAmount, "p is as follows") 
for i in range(len(coins)): 
    print("There's " , change[i] ,"....", listOfCoins[i] , "pence pieces in your change")