# Finding the right amount to save away

I am currently learning python and as a little test a friend of mine gave me a problem from the MIT open courseware python course. However, I am struggling on part C of the problem. It requires that you use a binary search to find the right amount you need to save if you want to buy a house in 3 years given a starting salary.

Here is the problem pdf for further details (scroll to part C):
https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-0001-introduction-to-computer-science-and-programming-in-python-fall-2016/assignments/MIT6_0001F16_ps1.pdf

I have technically "solved" it and am able to find the correct value according to the test cases given but the percents have many digits and the amount of bisection searches counted is much higher than that of the test cases.

I was wondering if there is actually anything wrong with my code and if I am implementing the binary search correctly with regards to this problem.

Example test cases:
Test Case 1:

Enter the starting salary:â€‹ 150000

Best savings rate:â€‹ 0.4411

Steps in bisection search:â€‹ 12

MY RESULTS:

Enter the starting salary:â€‹ 150000

Best savings rate:â€‹ 0.4411391177390328

Steps in bisection search:â€‹ 40

Thanks for any help!

Apologies in advance for this question I am still learning ;P

My Code:

``````annual_salary = float(input('Enter the starting salary: '))
constant = annual_salary
semi_annual_rate = 0.07
r = 0.04
down_payment = 0.25
total_cost = 1000000
current_savings = 0
months = 0
bisection_count = 0
min = 0
max = 1
portion_saved = (max/2.0)/1000

if(annual_salary*3<down_payment*total_cost):
print('It is not possible to pay the down payment in three years.')

while(True):
while(months<36):
current_savings += (current_savings*r/12)+(portion_saved*(annual_salary/12))
months+=1
if(months % 6 == 0):
annual_salary += annual_salary*semi_annual_rate
if(current_savings >= down_payment*total_cost+100):
max = portion_saved
portion_saved = max/2.0
bisection_count+=1
months = 0
current_savings = 0
annual_salary = constant
elif(current_savings >= down_payment*total_cost-100 and current_savings <= down_payment*total_cost+100):
break
else:
min = portion_saved
portion_saved = (max+min)/2.0
bisection_count+=1
months = 0
current_savings = 0
annual_salary = constant

print('Best savings rate: ', portion_saved)
print('Steps in bisection search: ', bisection_count)
``````

## Solution

The line which causes too many iterations is

``````portion_saved = max/2.0
``````

You should simply do

``````portion_saved = (max+min)/2.0
``````

as you correctly do some lines below.

Note you’re not strictly respecting the assignment since it asks to use `int` values in the range 0-10000 for `portion_saved`, not `float` – in this test case it even comes as a slight advantage because you get 11 iterations instead of 12, but in other cases it may be the other way round. Anyhow if you want to keep using `float` you may just `format` the result.

One last, very important thing: please don’t use `min` and `max` as variable names. You’re overwriting two built-in functions, so should you ever need to do `min(5,2,7)` you would get

``````TypeError: 'float' object is not callable
``````