Функция Python: Найти изменение от суммы покупки - PullRequest
0 голосов
/ 07 марта 2009

Я ищу наиболее эффективный способ выяснить сумму изменения (кварталы, центы, никели и пенни) из суммы покупки. Сумма покупки должна быть менее 1 доллара, а изменение - от одного доллара. Мне нужно знать, сколько четвертей, центов, никелей и копеек кто-нибудь получит.

Было бы лучше настроить словарь?

Ответы [ 5 ]

7 голосов
/ 07 марта 2009

Ну и дела, ты имеешь в виду, что это больше не проблема 2b в каждом курсе программирования? Эх, вероятно нет, они, кажется, тоже не учат людей, как делать изменения. (Или, может быть, они делают: это домашнее задание?)

Если вы найдете кого-то старше 50 лет и попросите его внести изменения, это работает следующим образом. Скажем, у вас есть чек на 3,52 доллара, и вы передаете кассиру немного денег. Они внесут изменения, сказав «три пятьдесят два», а затем

  • сосчитать три копейки, сказав "три, четыре, пять" (3,55)
  • Обратный отсчет 2 никеля, (3,60, 3,65)
  • Обратный отсчет (3,75)
  • четверть (4 доллара)
  • долларовая купюра (пять долларов)
  • счет за 5 долларов (десять долларов)
  • счет за 10 долларов (двадцать)

По сути, это рекурсивный процесс: вы возвращаете текущее номинальное значение до тех пор, пока текущее значение плюс следующее номинальное значение не станут четными. Затем перейдите к следующей деноминации.

Конечно, вы можете делать это итеративно, как указано выше.

4 голосов
/ 07 марта 2009

Это, вероятно, довольно быстро - всего несколько операций на деноминацию:

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

    return money
0 голосов
/ 31 октября 2014

Вышеупомянутое решение работает.

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)

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

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 )

Или другое решение

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" )
0 голосов
/ 10 марта 2009

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

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

Это не совсем то, что вы хотите, но его можно легко изменить, чтобы получить ваш результат.

0 голосов
/ 07 марта 2009

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

Например

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

Простите за мой паршивый синтаксис Python. Надеюсь, этого достаточно, чтобы продолжить.

...