算法计算在12个月内支付余额的最低金额

时间:2015-09-11 17:44:51

标签: python

我正在努力解决一个问题,该问题计算了在12个月内偿还信用卡余额所需的最低固定月付款额。通过固定的每月付款,我的意思是单个数字,每个月不会改变,而是每月支付的固定金额,10的倍数和所有月份相同的数字。 (使用此付款方案可能会使余额变为负数,这是可以的)

所以输入我有

original_balance = 3329

annualInterestRate = 0.2

由此我正在计算以下内容:

after_12_months_interest = original_balance
monthlyInterestRate = round(annualInterestRate/12.0,2)
monthly_payment = 10
total_paid = 0

for i in range(0,12):
    after_12_months_interest = after_12_months_interest + (annualInterestRate/12.0)*after_12_months_interest

while total_paid < after_12_months_interest:
    new_balance = 0
    unpaid_balance = original_balance - monthly_payment 
    total_paid = 0
    for i in range(0, 13):
        total_paid = total_paid + monthly_payment
    if total_paid < after_12_months_interest:
        monthly_payment = monthly_payment + 10

print "Lowest Payment: ", monthly_payment

我的问题是我最终得到的月薪比我应该多一点。在这种情况下,monthly_payment的返回值是320而不是310.对于所有用例,我尝试过monthly_payment,它比它应该稍微多一点。

任何人都可以给我一些关于我做错的提示或想法。谢谢

1 个答案:

答案 0 :(得分:1)

强制性单行

from itertools import count

print(next(payment for payment in count(0, 10) 
    if sum(payment*(1+monthly)**i for i in range(12)) > original_balance*(1+annual)))

这是做什么的:

  • next获取迭代器的第一个元素。
  • count尝试从0到无穷大的值(每次只调用next,并且只返回一个值)
  • sum(payment*(1+monthly)**i for i in range(12))这是付款的总价值。每笔付款都是值得的,加上所有已保存的利息(您偿还的时间越早,您对此后的利息就越少)
  • 如果没有任何回报,
  • original_balance*(1+annual)确实是总价值。

替代

print(next(payment for payment in count(0, 10) 
    if reduce(lambda x,_:(x - payment)*(1+monthly), range(12), original_balance) <= 0))

这个计算债务的总余额reduce原始平衡12次。