头歌 python 练习五 循环结构
第1关: python圆周率计算
y=eval(input())
#开始
s = 0 # 初始化累加器
k = 0 # 初始化项的索引
# 开始
while True:
term = (-1)**k / (2 * k + 1) # 计算当前项
if abs(term) < y: # 检查项的绝对值是否小于 y
break # 如果小于 y,退出循环
s += term # 将当前项累加到 s
k += 1 # 增加 k 的值
# 结束
s *= 4 # 乘以 4 得到 π 的近似值
#结束
print("{:.4f}".format(s))
第2关:银行利息计算
任务描述
本关任务:
某人有资金100000元,他存入银行一年期的大额存款,年利率为5%,一年后又将所有资金转存。若银行利率一直不变,求想获得指定金额的资金,存款至少需要多少年。
测试输入120000
输出4
y=eval(input())
#开始
# 初始化变量
initial_amount = 100000 # 初始资金
annual_rate = 0.05 # 年利率
n = 0 # 存款年数
# 计算所需年数
while initial_amount < y:
initial_amount *= (1 + annual_rate) # 计算下一年的资金
n += 1 # 年数增加
#结束
print("{:d}".format(n))
第3关:模体motify查找
任务描述
部分序列在不同基因组中共有,这种序列我们称为Motif。
事实上基因组中的Motif出现多次,这种情况称为重复。
给出一个长的DNA字符串s,和一个较短的DNA字符串t。
要求找出s中出现t的所有位置。注意位置从0开始计数。
输出t在s中出现的位置,即起始下标。如果有多次匹配,都需要输出。
s=input("输入长DNA")
t=input("输入模体")
#代码开始
positions = []
index = 0
# 使用find方法查找t在s中的所有位置
while index < len(s):
index = s.find(t, index) # 从当前索引位置开始查找
if index == -1: # 如果找不到,退出循环
break
positions.append(index) # 找到的位置添加到列表
index += 1 # 更新索引位置,继续查找下一个可能的位置
# 输出结果
if positions:
for pos in positions:
print(pos)
else:
print("没有此模体")
第4关:苹果问题
任务描述
在宫廷举办的数学竞赛中,斐波那契曾提出过如下的“苹果问题”:一个人经过n道门进入苹果园,摘了许多苹果。离开果园时,给第一个守门人一半苹果加1个;给第二个守门人余下的一半苹果加1个;对其他守门人也是如此这般,最后他带1个苹果离开果园.请问他当初一共摘了多少苹果。
输入n,计算他当初摘的苹果数
例如,输入7,输出384
n=eval(input())
#代码开始
remaining_apples = 1 # 最后带走的苹果数量
# 逆向推算
for _ in range(n):
remaining_apples = (remaining_apples + 1) * 2
#代码结束
x = remaining_apples
print("苹果数{}".format(x))
第5关:韩信点兵
任务描述
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾(余下的人数)就知道总人数了。
输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。
已知总人数不小于10,不超过100
a=eval(input("a"))
b=eval(input("b"))
c=eval(input("c"))
#代码开始
found_solution = False
for total in range(10, 101): # 检查10到100之间的数字
if (total - a) % 3 == 0 and (total - b) % 5 == 0 and (total - c) % 7 == 0:
print(total) # 找到符合条件的总人数
found_solution = True
break # 找到一个结果就停止检查
if not found_solution:
print("无解")
#代码结束
第6关:电商促销循环计算
任务描述
某电商双11促销活动。消费金额每满200元减免30元,上不封顶。
若用户是vip,则对优惠后的金额再享受95折优惠。
编写程序,用户可反复输入消费金额和是否vip(y表示是n表示否),计算并显示实际付款和优惠金额,直到用户输入消费金额0为止。(显示保留两位小数)
x=eval(input("消费金额"))
#代码开始
while True:
if x == 0:
break
s = x
if x >= 200:
a = x // 200
s = x - 30 * a
sf = input("是否vip")
if sf == "y":
s = s * 0.95
else:
s = s
print("实际付款{:.2f}优惠{:.2f}".format(s,x-s))
x = eval(input("消费金额"))
#代码结束
第7关:分解质因数
任务描述
把一个合数用质因数相乘的形式表示出来,叫做分解质因数。
n=eval(input())
#代码开始
m = n
i = 2
s = 1
print("%d=" % n, end="")
while True:
if m%i==0:
m = m / i
s = s * i
print("%d" % i, end="")
if s == n:
print()
else:
print("*",end="")
else:
i += 1
if i == n + 1:
break
第8关:银行信息查询
任务描述
本关任务:编写一个能查询银行信息的小程序。
银行信息.csv文件如下所示:每行显示银行的编号,名称,省份,城市和类别信息。
f1=open("lx2//银行信息.csv","r",encoding="utf8")
x=input("银行名称")
y=input("城市")
#代码开始
n = 1
for i in f1:
i = i.strip("\n").split(",")
if len(i[3]) > 3:
if x == i[4][-4:] and y == i[3][0:-1]:
print(n, end=" ")
print(i[0],i[1],i[2],i[3],i[4],sep=",")
n = n + 1
elif x == i[4][-4:] and y == i[3][0:2]:
print(n,end=" ")
print(i[0],i[1],i[2],i[3],i[4],sep=",")
n = n + 1
else:
if x ==i[4][-4:] and y == i[3]:
print(n,end=" ")
print(i[0],i[1],i[2],i[3],i[4],sep=",")
n = n + 1
if n-1 == 0:
print("无符合条件的银行")
else:
print("共%d个银行" % (n - 1))
#代码结束
f1.close()
第9关:区县信息查询
本关任务:编写一个能查询湖南省的区县信息的小程序。
湖南区县.csv文件如下所示:每行显示城市名称、区县名称和街道乡镇名称
f1=open("lx2//湖南区县.csv","r",encoding="utf8")
s=input("区县名称")
#代码开始
n = 1
count1 = 0
count2 = 0
count3 = 0
c = 0
for i in f1:
i = i.strip("\n").split(",")
if s == i[1]:
c += 1
print(n,end=" ")
print(i[0],i[1],i[2],sep=",")
n = n + 1
if i[2][-1] == "道":
count1 += 1
elif i[2][-1] == "乡":
count2 += 1
elif i[2][-1] == "镇":
count3 += 1
if c > 0:
print("{}个街道{}个乡{}个镇".format(count1,count2,count3))
else:
print("没有此区县信息")
#代码结束
f1.close()
作者:b-reeze_