我的 MITx CS 课程有一个作业,但我遇到了以下问题:
以下变量包含如下所述的值:
balance - 信用卡上的未结余额
年利率 - 以小数表示的年利率
概括一下这个问题:我们正在寻找最小的每月付款,以便我们可以在一年内还清全部余额。这个支付价值的合理下限是多少?0 美元是显而易见的答案,但你可以做得更好。如果没有利息,债务可以每月支付原来余额的十二分之一,所以我们每个月至少要支付这么多。原始余额的十二分之一是一个很好的下限。
什么是好的上限?想象一下,我们没有按月支付,而是在年底付清了全部余额。我们最终支付的金额必须大于我们每月分期支付的金额,因为利息是我们每个月没有还清的余额的复利。因此,每月支付的一个好的上限将是余额的十二分之一,在其利息按月复利一整年之后。
简而言之:
月利率=(年利率)/12.0 月供下限=余额/12 月供上限=(余额x(1+月利率)12)/12.0
编写一个程序,使用这些边界和二分搜索(有关更多信息,请查看关于二分搜索的 Wikipedia 页面)来找到每月支付的最小一分钱(不再是 10 美元的倍数),这样我们就可以在一年内还清债务. 尝试使用大输入,并注意它有多快(在问题 2 的解决方案中尝试相同的大输入进行比较!)。产生与问题 2 中相同的返回值。
现在,这是我能够想出的,但它实际上会产生错误的输出。我不知道这段代码出了什么问题:
#------------Defined variables---------------#
balance = 999999
annualInterestRate = 0.18
#------------Defined variables---------------#
monthlyInterestRate = annualInterestRate / 12.0
monthlyPaymentLower = balance / 12
monthlyPaymentUpper = (balance * (1 + monthlyInterestRate)**12) / 12.0
month = 1
total = 0
while (total < balance) and month < 13:
pay = (monthlyPaymentLower + monthlyPaymentUpper) / 2
total += pay
if total < balance:
monthlyPaymentLower = pay
elif total > balance:
monthlyPaymentHigher = pay
month += 1
if month == 13:
total = 0
month = 1
print 'Lowest Payment: ' + str(round(pay, 2))
帮助?
像往常一样,不寻找完整的解决方案或源代码,只是提示我哪里出错了。(我总是得到反对票。:/)