MIT6_0001F16_ps1

MIT6_0001F16_ps1

ps1a
首先根据投资回报以及工资等资金变化情况,通过循环模拟每个月的储蓄变化情况,得出买房需要多少个月,具体程序解析看程序里的注释

# -*- coding: utf-8 -*-
"""
Created on Fri Mar 15 20:50:56 2019

@author: Ding 
"""

# 提示用户输入年薪、存款率以及房子总价
string1=input("Enter your annual salary: ")
annual_salary=int(string1)   #将字符串转化为数字

string2=input("Enter the percent of your salary to save, as a decimal: ")
portion_saved=float(string2)  #将小数转化为float

string3=input("Enter the cost of your dream home: ")
total_cost=int(string3)      #将输入的数字转化为int

# print (annual_salary,portion_saved,total_cost)

portion_down_payment=0.25       #首付占总价的比例
payment=portion_down_payment*total_cost  #payment表示首付价钱
r=0.04   #年利率
month=0  #从第0个月开始
current_savings=0
while current_savings<payment:   #如果仍旧买不起,则继续循环
    month+=1   #过了一个月
    
    current_savings=current_savings+current_savings*r/12+annual_salary*portion_saved/12  
    #每过一个月自己的财富增加,财富=上个月财富+自己工资用于买房的部分+上个月赚的钱
print("Number of months: ",month)#打印结果

ps1b
在A题基础上增添了每半年的工资涨幅,因此与A类似,通过循环模拟每个月的情况,但是增添一个判断条件,即如果月份是6的倍数,工资发生涨幅。具体实现细节见代码注释

# -*- coding: utf-8 -*-
"""
Created on Fri Mar 15 21:18:15 2019

@author:  Ding 
"""
# 提示用户输入年薪、存款率以及房子总价以及每半年工资的涨幅
string1=input("Enter your annual salary: ")#输入年薪
annual_salary=int(string1)   #将字符串转化为数字

string2=input("Enter the percent of your salary to save, as a decimal: ")#输入存款率
portion_saved=float(string2)  #将小数转化为float

string3=input("Enter the cost of your dream home: ")  #输入房价
total_cost=int(string3)      #将输入的数字转化为int

string4=input("Enter the semi­annual raise, as a decimal:") #输入每半年工资涨幅
semi_annual_raise=float(string4)   #将输入的数字转化为小数
# print (annual_salary,portion_saved,total_cost)

portion_down_payment=0.25       #首付占总价的比例
payment=portion_down_payment*total_cost  #payment表示首付价钱
r=0.04   #年利率
month=0  #从第0个月开始
current_savings=0
while current_savings<payment:   #如果仍旧买不起,则继续循环
    month+=1   #过了一个月
    current_savings=current_savings+current_savings*r/12+annual_salary*portion_saved/12
     #每过一个月自己的财富增加,财富=上个月财富+自己工资用于买房的部分+上个月赚的钱
    if month%6==0:       #如果过了6个月,则涨工资
        annual_salary+=annual_salary*semi_annual_raise
print("Number of months: ",month)#打印结果

ps1c

该题主要是在确定房价以及投资回报率、工资涨幅率等的情况下,确定出在给定工资的情况下如何存款使得能够满足3年内买房。
通过函数result(salary,rate)模拟给定工资与存款比的情况下,能否完成3年付首付的情况。在此我确定的条件为100W的房价可以少付款100,与示例有微小差别。

# -*- coding: utf-8 -*-
"""
Created on Fri Mar 15 21:25:49 2019

@author:  Ding
"""
string1=input("Enter the starting salary:​ ")#输入最初的年薪
salary=int(string1)   #最初的年薪salary
def result(salar,rate):             # 用result函数求在工资和rate确定的情况下能否完成3年买房
    total_cost=1000000     #房价为1000000
    semi_annual_raise=0.07  #半年工资涨幅
    portion_down_payment=0.25       #首付占总价的比例
    payment=portion_down_payment*total_cost  #payment表示首付价钱
    r=0.04   #年利率
    month=0  #从第0个月开始
    current_savings=0 #初始金钱为0
    while month<36:     #用while循环模拟3年的储蓄情况
        month+=1
        current_savings=current_savings+current_savings*r/12+salar*rate/12 #每个月储蓄变化情况
        if month%6==0:               #每六个月工资需要涨幅
            salar+=salar*semi_annual_raise
        if current_savings>=payment-80:     #我的条件为100美元,即可以少付款100美元之内都行
            return True
    return False
left=0
right=10000       #用二分查找确定的数字
if result(salary,right/10000)==False:
    print("It is not possible to pay the down payment in three years.")
else:
    bi_times=0   #记录二分查找次数
    while right-left>1:
        bi_times+=1
        mid=(right+left)/2   #二分
        if result(salary,mid/10000):  #如果满足,则尝试继续缩小范围
            right=mid
        else:
            left=mid      
    print("Best savings rate:%.4f" %(mid/10000)) #输出结果
    print("Steps in bisection search:",bi_times)

你可能感兴趣的:(MIT,python课程作业)