本章我们将继续通过一些典型例题来巩固循环结构程序设计。
第1关:输出素数
任务描述
本关任务:编程,输出[100,200]内所有的素数,每行输出5个数,数之间用tab符分隔。并输出区间内素数的个数
测试说明
平台会对你编写的代码进行测试:
预期输出:
101 103 107 109 113
127 131 137 139 149
151 157 163 167 173
179 181 191 193 197
199
num=21
代码解析
num = 0
for i in range(100,201):
n = i//2
s = 1
for j in range(2,n+1):
if i%j == 0:
s = 0
break
if s == 1:
print(i,end = "\t")
num += 1
if num%5 == 0:
print()
print()
print(f"num={num}")
当然如果你调用math模块把遍历的上限n改为根号i可以进一步减少循环次数从而降低时间复杂度
第2关:九九乘法表
任务描述
本关任务:编程,输出九九乘法表。
测试说明
平台会对你编写的代码进行测试:
预期输出:
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
代码解析
for i in range(1,10):
for j in range(1,i+1):
print(f"{i}*{j}={i*j}",end = "\t")
print()
第3关:百马百担问题
任务描述
本关任务:编程计算百马百担问题,有100匹马,驮100担货,大马驮3担,中马驮2担,两匹小马驮1担,问有大、中、小马各多少?
测试说明
平台会对你编写的代码进行测试:
预期输出:
大马2匹,中马30匹,小马68匹
大马5匹,中马25匹,小马70匹
大马8匹,中马20匹,小马72匹
大马11匹,中马15匹,小马74匹
大马14匹,中马10匹,小马76匹
大马17匹,中马5匹,小马78匹
大马20匹,中马0匹,小马80匹
代码解析
暴力枚举即可
ma = 100
huo = 100
for b in range(huo//3):
for m in range(huo//2):
for s in range(huo):
if(b*3+m*2+s*0.5 == huo) and (s+m+b == ma):
print(f"大马{b}匹,中马{m}匹,小马{s}匹")
第4关:斐波那契数列
任务描述
本关任务: 输出斐波那契数列的前N项,每一行5个数。该数列的第1项和第2项为1,从第3项开始,每一项均为其前面2项之和,即1,1,2,3,5,8,……。
测试说明
平台会对你编写的代码进行测试:
测试输入: 10
预期输出:
1 1 2 3 5
8 13 21 34 55
代码解析
这一题常见的解法自然是递推和递归
递推:
(1)递推的初始条件:n1和n2的初值为1。
(2)每次执行循环,用n1和n2产生后项,即n3=n1+n2。
(3)下一次循环中,n1=n2,n2=n3。
(4)如果未达到规定的循环次数,则返回步骤(2);否则停止计算。
def f(n):
n1 = 1
n2 = 1
if (n==1) or (n==2):
return 1
elif n>=3:
for i in range(3,n+1):
n3 = n1 + n2
n1 = n2
n2 = n3
return n2
num = int(input())
for i in range(1,num+1):
print(f(i),end = "\t")
if i%5 == 0:
print()
当然,根据Python自身的特性,函数f(n)中的三段递推式可以改写成这样会更简单:
n1,n2 = n2,n1+n2
递归:
(1)递归的初始条件:f1和f2的初值为1。
(2)递归函数可直接参考题目
(3)当n = 1或2时,f(n) = 1
(4)当n >=3时,f(n) = f(n-1) + f(n-2)
def f(n):
if (n==1) or (n==2):
return 1
elif n>=3:
return f(n-1)+f(n-2)
num = int(input())
for i in range(1,num+1):
print(f(i),end = "\t")
if i%5 == 0:
print()
两种方法都是可行的,但是对于这道题本人更加推荐用递推法。虽然它的代码量相对较大,但是时间复杂度会更小