0

私はこの問題に何時間も夢中になっていて、何度もやり直していました! この時点で、私は実際に数字が私の周りを飛んでいるのを見ていると思います.

とにかく、クレジット カードの借金を返済するために、1 年間にわたって毎月支払う正しい金額を見つけるプログラムを作成することになっています。したがって、このプログラムでは、満たさなければならないいくつかの条件があります。

  • 二分探索 ((low + high) / 2) を使用して行う必要があります。
  • バランスが決まっている
  • 年利があります。

現時点での私のコードは次のとおりです。これで得られるのは無限ループだけです。ここで何が間違っていますか?

balance = 320000
annualInterestRate = 0.2

monthly_interest = float(annualInterestRate) / 12.0
lower_bound = float(balance / 12)
upper_bound = (balance * (1 + monthly_interest)**12) / 12.0
epsilon = 0.01
ans = float(lower_bound + upper_bound) / 2

while abs((balance * (1 + monthly_interest)**12) / 12.0) >= epsilon:

    ans = float(lower_bound + upper_bound) / 2
    total = float(ans * 12)
    new_balance = 0
    interest = 0

    for month in range(0, 12):
        interest += ans + (1 + monthly_interest)
        new_balance += ans + interest

    if new_balance > balance:
        upper_bound = ans
        print "low" + str(new_balance)
    elif new_balance < balance:
        lower_bound = ans
        print "high" + str(new_balance)
    else:
        print "What's going on here?"

print "Lowest payment: %r" % ans
4

1 に答える 1

1

ここにはいくつか問題があると思います。まず最初に、使用している条件が解に収束しないため、 while は無限ループです (ループ内で変数の値が変化することはありません)。その上、(その間の) 条件は、この種の問題では間違っているようです。

これは私があなたがやろうとしていることだと思います.あなたは「月々の支払い」の上限と下限を見つけようとしています.エラーはイプシロン未満である必要があります)。

ループ内では、中間点を正しく計算しています。この中間点はすでに利息を考慮していますが、再度計算しています。上限と下限を変更する条件は利息を考慮していないため、コードのこの部分は少し面倒です。

したがって、これらの条件を変更すると、プログラムは実際にソリューションに収束します。

balance = 320000
annualInterestRate = 0.2

monthly_interest = float(annualInterestRate) / 12.0
lower_bound = float(balance / 12)
upper_bound = (balance * (2 + monthly_interest)**12) / 12.0
epsilon = 0.001
ans = float(lower_bound + upper_bound) / 2
total_debt=balance * (1 + annualInterestRate)
print total_debt
while (upper_bound - lower_bound) >= epsilon:

    ans = float(lower_bound + upper_bound) / 2
    total = float(ans * 12)

    if total > total_debt:
        upper_bound = ans
        print "low " + str(total)
    elif total < total_debt:
        lower_bound = ans
        print "high " + str(total)
    else:
        print "Solution found"
    break


print "Lowest payment: %r" % ans

それが役に立てば幸い!

于 2014-09-10T19:14:56.383 に答える