2016-05-03 4 views
0

Мне поручено сделать программу, которая возьмет денежную сумму и найдет минимальное количество монет, необходимых для получения этой суммы. вот мой код.python найти минимальное количество монет

import math 

n1 = eval(input("Enter a monetary amount: ")) 

n1 = n1 * 100 

dollars = 0 
quarters = 0 
dimes = 0 
nickels = 0 
pennies = 0 

dollars = n1/100 
n1 %= 100 

quarters = n1/25 
n1 %= 25 

dimes = n1/10 
n1 %= 10 

nickels = n1/5 
n1 %= 5 

pennies = n1 


print (int(dollars), int(quarters), int(dimes), int(nickels), int(pennies)) 

всякий раз, когда я ввожу число, которое требует никеля, оно не учитывает их. например, выход на 1.05 будет

1 0 0 0 0 

выход на 1,15

1 0 1 0 4 

любые намеки будут оценены, спасибо.

отредактировал опечатку, которая у меня была, код все еще не работает должным образом.

+0

Дать решение, которое работает на любой валютной системы является сложным, если у вас есть такие ценности, как 10, 7, 5 и 1. Если вы хотите получить лучшую конфигурацию для 12, вы не можете просто использовать самую большую и продолжать, потому что это даст результат «1 * 10 2 * 1», используя 3 монеты, хотя вы можете сделать это с помощью 2 : '1 * 7 1 * 5'. Я попытаюсь написать такое решение в любом случае *, потому что * это сложно. – CodenameLambda

+3

Зачем использовать 'eval' вместо' int' или 'float'? –

+1

@KevinMGranger Я бы предположил, что он прошел через скрипт '2to3', поскольку он меняет' input (...) 'python2' на 'eval (input (..))' –

ответ

0

Выглядит как опечатка: nickels против nickles

Edit: теперь, когда вы исправили опечатку, похоже, это, безусловно, округление вопрос. Поскольку вы конвертируете из доллара в целых несколько центов, попробуйте превратить его в целое число, прежде чем выполнять какие-либо операции.

Измените свою линию n1 = n1 * 100 на n1 = int(round(n1 * 100)). Я попробовал это на своем компьютере, и это, казалось, сработало.

+0

спасибо, но ее по-прежнему не дает мне правильного номера монет – user24580807245

+0

спасибо за вашу помощь – user24580807245

0

Вы работаете в вопросах с плавающей точкой:

>>>> 1.15*100 
114.99999999999999 

Как вы можете видеть, здесь явно не 115 центов. У вас есть только под этим. Таким образом, вы используете один доллар, одну копейку и 4,99999 пенни (int округляет его до четырех).

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

+0

Я согласен с Робом. Для полноты, когда вам нужно иметь дело с более вовлеченной обработкой десятичных знаков, включая валюту, проверьте десятичную библиотеку: https://docs.python.org/2.7/library/decimal.html – ViennaMike

0

Лучше всего работать с центами на все пути для таких проблем. Попробуйте сделать 105 центов (целое число) вместо 1,05 раза 100. Вы можете избежать округления все вместе. Кроме того, поскольку вы заботитесь о «остатке», используйте оператор modulo вместо деления.

Я бы решить, как это:

cents = 115 
remainder = cents%25 
nickels = (cents - remainder)/25 

cents = remainder 
remainder = cents%10 
dimes = (cents - remainder)/10 

... 

и так далее.

Однако, возможно, не вопрос, который вы задали, но в общем случае эта проблема является NP-трудной, и, кроме того, в зависимости от номиналов монет некоторые изменения не поддаются оценке.

+0

'n1% = 100' OP * * использует оператор modulo. –

+0

Правда; извините за формулировку; Я имел в виду использование «деления» после «по модулю», чтобы избежать плавающих точек. чтобы убедиться в делимости, и не делайте первого умножения n1 * 100. – user1669710

0

Вы можете обратиться к Is floating point math broken? для более полного объяснения о том, что происходит, но в основном, когда вы вводите 1.05 в код (или через eval) он не хранит точное значение, которое вы могли бы ожидать:

>>> (1.05).as_integer_ratio() 
(4728779608739021, 4503599627370496) 

Если вы хотите, чтобы компьютер для хранения точного десятичного представления числа вы можете просто использовать decimal.Decimal для промежуточного этапа:

n1 = decimal.Decimal(input("Enter a monetary amount: ")) 

n1 = int(n1 * 100) #now you won't get rounding issues 

попеременно вы можете п задница число вошел себя, чтобы удалить десятичную и пропустить математику, необходимую для компенсации всех togther:

def dollar_to_cent(s): 
    n,_,end = s.partition(".") 
    if not all(i=="0" for i in end[2:]): 
     raise ValueError("can only have up to two digits after decimal.") 
    return int("{}{:0<2}".format(n,end[:2])) 

>>> dollar_to_cent("1") 
100 
>>> dollar_to_cent("2.") 
200 
>>> dollar_to_cent("2.3") 
230 
>>> dollar_to_cent("2.05") 
205 
>>> dollar_to_cent("2.050000") 
205 
>>> dollar_to_cent("2.001") 
Traceback (most recent call last): 
    ... 
ValueError: can only have up to two digits after decimal.