1

我的 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))

帮助?

像往常一样,不寻找完整的解决方案或源代码,只是提示我哪里出错了。(我总是得到反对票。:/)

4

1 回答 1

0

到位

total += pay

您必须像问题 2 中一样计算 12 个坐骑的余额

for month in range(12):
  balance = balance - pay
  balance = balance + monthlyInterest

比你必须比较balance0改变monthlyPaymentLowermonthlyPaymentUpper

你必须比较monthlyPaymentLowermonthlyPaymentUpper看看你能不能完成

if monthlyPaymentUpper - monthlyPaymentLower < 0.001 :
    print "now I can finish searching"

当然,在这种情况下,您将不得不在代码中更改更多内容:)

于 2013-11-02T15:37:13.843 回答