在我要测试正确性的编程问题中,我遇到了以下情况,我担心我不知道这个好的解决方案。
http://codeabbey.com/index/task_view/mortgage-calculator
很快:这是一个给定大小P
的贷款,每月按利率R% / 12
增加,然后减去客户的每月付款M
。超过L
个月的债务减少到零(即客户支付了它)。
看起来给定P
,M
和R
我可以使用简单循环轻松计算L
。但这是相反的任务 - 我将按给定的贷款期限M
以及L
和P
找到每月付款R
。
我想也许我可以使用二进制搜索来测试M
的不同变体并为他们反复计算L
......但我不确定这是否合适 - 我不知道可能存在一些我找不到的直接数学解法?
提前感谢!
答案 0 :(得分:5)
您可以在恒定时间内计算出来。
Rm = R / 12
M = P * Rm / ((1 - (1 + Rm)^(-L)))
^
代表取幂的地方。例如:
P = 1000
R = 24% = 0.24
Rm = 0.24 / 12 = 0.02
L = 5 months
M = 1000 * 0.02 / (1 - 1.02^(-5))
M = 212.16
让我们看看它是否有效:
P0 = 1000
P1 = 1020 // interest
P1' = 807,84 // rate paid, end of first month
P2 = 823,9968
P2' = 611,8368 // after second month
P3 = 624,073536
P3' = 411,913536 // after third month
P4 = 420,15180672
P4' = 207,99180672 // after fourth month
P5 = 212,1516428544
在这里,你在第五个月之后完全还清了。由于四舍五入,该数字不匹配100%。你可以根据M到213的链接。然而你最终将它围绕它,围绕它向上,而不是向下。
答案 1 :(得分:0)
今天挣扎着。 我认为他们想要没有公式的任务。像传动装置一样。出于教育目的。 对我来说也很难。因此,在以前的二元搜索方程问题的灵感之后,我终于找到了一种方法。
def incrMontant(montant,interest,months,payment=0):
while months:
increment = montant * (interest/100) /12
montant += increment
montant -= payment #this trick call other function.
months-=1
return montant
def payment(montant,interest,months):
pay = 0
while incrMontant(montant,interest,months,pay) > 0:
pay += 1
return pay
montant, interest, months = (int(x) for x in input().split())
print(payment(montant,interest,months))