背景需求
设计过程:
AI写了很多的答案,但是都不正确
于是我去查看了网上的正确答案——47.41美元
此外,题目的0.99涉及了浮点数,非整数,无法range遍历
最后终于有一个答案正确的代码
通过反复测试,终于写出一个适合的代码
代码展示:
'''
3、他的第一份工作
“嗨!约翰尼斯,”星期天乔在街上遇到一个年轻人向他喊道,“好久不见,我听说你开始工作啦!”
“几个星期了,”约翰尼斯回答道,“这是一份计件工作,我干得挺好的。第一星期我得了四十多美元,而且后来每个星期都比前一个星期多赚99美分。”
“这真是巧事!”乔笑了笑并继续说,“愿你一如继往都能这样!”
“我估计用不了多久我一个星期便能赚到60美元,”年轻人告诉乔,“自从开始工作到现在,我已经赚了整整407美元。这的确不坏!”
试问,约翰尼斯第一个星期赚了多少?# '''# 根据AI推荐的写法
'''# total_earning = 407。00# x = (total_earning - (1 + 2 + 3 + 4 + 5 + 6+7)*0.99 ) / 8# print(" @ 的值为:", x, "美元") # 正好等于47.41美元根据其中“周数累加”的方法,推算第一周的工资'''
# 一周40多美元(不确定数字),一共赚了407,大约10周
n=int(407/40)# 可能有10周,周数累加
day=0
days=[]
result1=[]
result2=[]
result3=[]
# [1,2,3,4,5,6,7,8,9,10]
for i in range(n):day+=1days.append(day) # print(sum(days))c=int(sum(days))# 1# 3# 6# 10# 15# 21# 28# 36 # x = (total_earning - (1 + 2 + 3 + 4 + 5 + 6+7)*0.99 ) / 8# 用上面的公式进行倒推提取周数的累加数字和除以的数字(周数+1)x=(407.00-c*0.99)/(int(len(days)+1))if 40<x<50: # 工资是40多美元print('第1周工资数可能是',round(x,2),'美元')# 第一周工资数 41.26222222222222 美元,所以要加roundprint('可能一共工作了',len(days),'周')result1.append(round(x,2))result2.append(len(days))result3.append(c)else:pass# 第1周工资数 47.41 美元# 一共工作了 7 周# 第1周工资数 41.26 美元# 一共工作了 8 周# 验证结果是否正确
for f in range(len(result1)):if result1[f]*(result2[f]+1)+result3[f]*0.99==407.00:print('约翰第1周工资数',result1[f],'元')print('约翰正好工作了',result2[f],'周')else:pass# 因为有两个40多美元,所以再列示计算是不是等于407.00元# (1-8累加=36)*0.99+41.26*9=406.98 不等于407.00# (1-7累加=28)*0.99+41.47*8=407.00 等于407.00# 最终结果# 约翰第1周工资数 47.41 元# 约翰正好工作了 7 周
最终结果:
代码解析:
这种方法有点类似于52周递增存钱法。
但是它是根据总数倒退初始金额(第一周的存款金额)
主要关键是根据总金额、倒退周次(存了几周)和递增数量(每周增加0.99美元。
因为不知道周次,所以我将总金额除以大致的工资数(407/40)在0-10之间遍历提取周数,然后减法得到可能的第1周数量,并限制在40-50之间。本题有两个40多的工资数,所以再次通过公式验证,排除不符合的答案。
延伸题目
用这种方法可以推算公积金第一年缴费多少(获得精确数字)
问题:公积金账户余额23200,已知第一年大约交了2000多,每一年增加200元,问第一年公积金具体多少,一共交了几年
'''
3、公积金账户
小明公积金账户有23200公积金。第一年大约是2000多公积金,此后一年递增200元”
小明第一年公积金多少,一共交了几年?# '''n=int(23200/2000)
all=23200.00
zj=200.00# 可能有10周,周数累加
day=0
days=[]
result1=[]
result2=[]
result3=[]
# [1,2,3,4,5,6,7,8,9,10]
for i in range(n):day+=1days.append(day) # print(sum(days))c=int(sum(days))x=(all-c*zj)/(int(len(days)+1))if 2000<x<3000: # 工资是40多美元print('第1年公积金可能是',round(x,2),'人民币')# 第一周工资数 41.26222222222222 美元,所以要加roundprint('可能缴了公积金',len(days),'年')result1.append(round(x,2))result2.append(len(days))result3.append(c)else:pass# 第1年公积金可能是 2714.29 人民币# 可能缴了公积金 6 年# 第1年公积金可能是 2200.0 人民币# 可能缴了公积金 7 年# 验证结果是否正确
for f in range(len(result1)):if result1[f]*(result2[f]+1)+result3[f]*zj==all:print('小明第1年公积金',result1[f],'元')print('小明正好缴了公积金',result2[f],'年')else:pass# 最终结果# 小明第1年公积金 2200.0 元# 小明正好缴了公积金 7 年