Задача поиска деления пополам - MIT Intro to CS Set Set - PullRequest
1 голос
/ 02 декабря 2019

Мне нужно найти лучшую норму сбережений для достижения первоначального взноса на дом стоимостью 1 млн. Долларов за 36 месяцев.

Вот значения, которые предопределены: 1. Ваш полугодовой рост составляет 0,07 (7%) 2. Годовой доход ваших инвестиций составляет 0,04 (4%). 3. Первоначальный взнос составляет 0,25 (25%) от стоимости дома. 4. Стоимость дома, на который вы экономите, составляет 1 миллион долларов США.

Это также непосредственно из поставленной задачи: поскольку мы ищем значение, которое в принципе является плавающим, мы ограничимся точностью до двух десятичных знаков (т. Е. Мы можем сэкономить на 7,04%или 0,0704 в десятичном виде - но мы не будем беспокоиться о разнице между 7,041% и 7,039%). Это означает, что мы можем искать целое число от 0 до 10000 (используя целочисленное деление), а затем преобразовывать его в десятичный процент (используя деление с плавающей запятой), чтобы использовать его при вычислении current_savings через 36 месяцев. Используя этот диапазон, мы ищем только конечное число чисел, в отличие от бесконечного числа десятичных знаков от 0 до 1. Этот диапазон поможет предотвратить бесконечные циклы. Причина, по которой мы используем от 0 до 10000, состоит в том, чтобы учесть два дополнительных десятичных знака в диапазоне от 0% до 100%. Ваш код должен распечатать десятичное число (например, 0,0704 для 7,04%).

#best savings rate in 3 years

annual_salary = float(input("Enter your annual salary: "))
total_cost = 1000000
semi_annual_raise = 0.07
portion_down_payment = 0.25*total_cost
r = 0.04

low = 0
high = 10000
portion_saved = int((high+low)/2)
steps = 0
current_savings = 0

months = 0
salary_increase_months = 0
while(months <= 36):
    portion_saved = portion_saved/1000
    #checks every 6th iteration to add the semi annual raise
    if(salary_increase_months == 6):
        annual_salary += annual_salary*semi_annual_raise
        salary_increase_months = 0
    current_savings += current_savings*(r/12) + portion_saved*(annual_salary/12)
    salary_increase_months += 1
    months += 1

    #bisection code
    if(months == 36):
        if current_savings < portion_down_payment:
            low = portion_saved
            months = 0
        elif current_savings > portion_down_payment:
            high = portion_saved
            print('Best savings rate:', portion_saved)
            print('Steps in bisection search:', steps)
            break
        else:
            print('It is not possible to pay the down payment in three years.')
            break
        portion_saved = (low + high)/2
        steps += 1       

Нам даны следующие тестовые примеры:

Контрольный пример 1

Enter the starting salary:​ 150000
Best savings rate:​ 0.4411
Steps in bisection search:​ 12

Тестовый пример 2

Enter the starting salary:​ 300000
Best savings rate:​ 0.2206
Steps in bisection search:​ 9

Тестовый пример 3

Enter the starting salary:​ 10000
It is not possible to pay the down payment in three years.

Для первого ввода вот что я получаю

Enter your annual salary: 150000
Best savings rate: 5.000000000000001e-105
Steps in bisection search: 2

Я только что получилбыло много проблем с пониманием того, что я делаю неправильно, и я хотел, чтобы кто-то помог мне и указал, что я делаю неправильно. Я хочу знать решение, но с некоторыми объяснениями тоже. Очевидно, я могу искать решения других людей, но я хочу понять, что я делаю неправильно, потому что я пытаюсь учиться.

...