整存零取月息为0.63%,每年底取出1000,五年刚好取完,计算最初存入金额。
(本笔记适合基本熟悉一门编程语言的 coder 翻阅)
Python 官网:https://www.python.org/
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
本文质量分:
CSDN质量分查询入口:http://www.csdn.net/qc
就在刚刚,再次检查代码时,才发现——“算法逻辑”一直都是对的,是我在“制造代码”实现算法时“不小心”有了疏漏。
本来,至此本篇文章也就没有继续写下去的意义了。😂但转念一想,还是贴出此篇逻辑混乱的笔记,以警醒自己,“有时候真的只是自己出错了”。
题目描述截屏图片
题目文本提取
题目没说明是年初元月一号存入,只说每年底取出1000,这多少有些困扰。所以我在这里假定元月一号存入。
算法拆分
:
假设存入A元
第一年终账户余额是:c1 = A × (1 + 0.63%) - 1000
第二年终账户余额是:c2 = c1 × (1 + 0.63%) - 1000
第三年终账户余额是:c3 = c2 × (1 + 0.63%) - 1000
第四年终账户余额是:c4 = c3 × (1 + 0.63%) - 1000
第五年终账户余额是:c5 = c4× (1 + 0.63%) - 1000
据题意,c5 = 0。
所以,c4 × (1 + 0.63%) - 1000 = 0
即c4 × (1 + 0.63%) = 1000
所以c4 = 1000 ÷ (1 + 0.63%) = 1000 ÷ 1.0063 = 993.7394
c3 = (c4 + 1000) ÷ (1 + 0.63%) = 1993.7394 ÷ 1.0063 = 1981.2575
c2 = 2981.2575 ÷ 1.0063 = 2962.59318
c1 = 3962.59318 ÷ 1.0063 = 3937.7851
最初存入
A = 3937.7851 + 1000 = 4937.7851
原来我才是小丑,自己计算表达式没整对,一直在瞎BB😭😭
旁门左道
”之穷举验证
这是当我“自己出错”,无法可想而采用的
最笨办法。
由于没有想到更好的办法,在CSDN问答社区的提问也未得到正确的答主回答。我只好选用“穷举”获取这道题目的正确答案了。
由于五年全部取出的总金额为5000.00,每月都会有0.63%的月利息增加,所以最初存入金额一定会小于5000.00。所以我在代码中选择从5000.00开始遍历轮询查找。虽然“算法”很笨,但机器很快,也还是将就可用。😋😋
代码运行效果截屏图片
代码
def trial(n):
''' 金额试算 '''
for i in range(5):
for j in range(12):
n *= (1 + 0.63/100)
n -= 1000
#return abs(n) < 1 # 判定绝对值不大于1。
return not n//1 # 整数部分为0,即认为可以取完。
if __name__ == '__main__':
for i in range(5000, 1, -1): # 从5000起逆序遍历可能的整数。
if trial(i): # 函数判定可以取完,即找到最初要存入的金额,退出循环。
break
print(f"\n最初应存入金额:{i:.2f}\n")
正统算法
”之循环算法
代码运行效果截屏图片
代码
#!/sur/bin/nve python
# coding: utf-8
def solution(n=0):
for i in range(5, 0, -1):
print(f"第{i:0>2}年底余额:{n:.2f}")
n += 1000
for j in range(12):
n /= (1 + 0.63/100)
print(f"最初存入金额:{n:.2f}")
return n
if __name__ == '__main__':
print()
a = solution()
print(f"\n验算:\n最初存入金额:{a:.2f}")
for i in range(5):
for j in range(12):
a = a*(1+0.63/100)
a -= 1000
print(f"第{i+1:0>2}年底余额:{a:.2f}")
print(f"\n最后余额:{a:.2f}")
正统算法
”之递归算法
代码运行效果截屏图片
代码
def solution(n, k):
if k:
print(f"第{k:0>2}年底余额:{n:.2f}")
else:
print(f"最初存入金额:{n:.2f}")
if k:
n += 1000
for i in range(12):
n = n/(1+0.63/100)
return solution(n, k-1)
else:
return n
if __name__ == '__main__':
a = solution(0, 5)
print(f"\n验算:\n最初存入金额:{a:.2f}")
for i in range(5):
for j in range(12):
a = a*(1+0.63/100)
print(f"第{i+1:0>2}年底余额:{a:.2f}")
a -= 1000
print(f"\n最后余额:{a:.2f}")
(源码较长,点此跳过源码)
#!/sur/bin/nve python
# coding: utf-8
def trial(n):
''' 金额试算 '''
for i in range(5):
for j in range(12):
n *= (1 + 0.63/100)
n -= 1000
#return abs(n) < 1 # 判定绝对值不大于1。
return not n//1 # 整数部分为0,即认为可以取完。
if __name__ == '__main__':
for i in range(5000, 1, -1): # 从5000起逆序遍历可能的整数。
if trial(i): # 函数判定可以取完,即找到最初要存入的金额,退出循环。
break
print(f"\n最初应存入金额:{i:.2f}\n")
## 循环算法 ##
def solution(n=0):
for i in range(5, 0, -1):
print(f"第{i:0>2}年底余额:{n:.2f}")
n += 1000
for j in range(12):
n /= (1 + 0.63/100)
print(f"最初存入金额:{n:.2f}")
return n
if __name__ == '__main__':
print()
a = solution()
print(f"\n验算:\n最初存入金额:{a:.2f}")
for i in range(5):
for j in range(12):
a = a*(1+0.63/100)
a -= 1000
print(f"第{i+1:0>2}年底余额:{a:.2f}")
print(f"\n最后余额:{a:.2f}")
## 递归算法 ##
def solution(n, k):
if k:
print(f"第{k:0>2}年底余额:{n:.2f}")
else:
print(f"最初存入金额:{n:.2f}")
if k:
n += 1000
for i in range(12):
n = n/(1+0.63/100)
return solution(n, k-1)
else:
return n
if __name__ == '__main__':
a = solution(0, 5)
print(f"\n验算:\n最初存入金额:{a:.2f}")
for i in range(5):
for j in range(12):
a = a*(1+0.63/100)
print(f"第{i+1:0>2}年底余额:{a:.2f}")
a -= 1000
print(f"\n最后余额:{a:.2f}")
我的HOT博:
本次共计收集 231 篇博文笔记信息,总阅读量 39.26w,平均阅读量 1699。已生成 26 篇阅读量不小于 3000 的博文笔记索引链接。数据采集于 2023-09-17 07:11:24 完成,用时 4 分 46.69 秒。
精品文章:
来源:老齐教室
◆ Python 入门指南【Python 3.6.3】
好文力荐:
CSDN实用技巧博文: