蓝桥杯python语言基础(3)——循环结构
一、for语句
理解range函数
range(start, stop, step)
- start: 序列开始的数字(默认为0)。
- stop: 序列结束的数字(不包含stop)。
- step: 步长(默认为1)。
练习
输出在 l 和 r 之间的所有偶数:
print(*(i for i in range(int(input()), int(input()) + 1) if i % 2 == 0))
练习
计算奇数和,偶数和
n=int(input()) print(*(sum(range(i, n + 1, 2)) for i in (1, 2)))
习题P152-反倍数
题目描述
给定三个整数 a,b,c,如果一个整数既不是 a 的整数倍也不是 b 的整数倍还不是 c的整数倍,则这个数称为反倍数。
请问在 1 至 n 中有多少个反倍数。
输入描述
输入的第一行包含一个整数 n。
第二行包含三个整数 a,b,c 相邻两个数之间用一个空格分隔。
其中,1≤n≤1000000,1≤a≤n,1≤b≤n,1≤c≤n1≤n≤1000000,1≤a≤n,1≤b≤n,1≤c≤n。
输出描述
输出一行包含一个整数,表示答案。
n = int(input()) a, b, c = map(int, input().split()) print(sum(1 for i in range(1, n + 1) if i % a and i % b and i % c))
if i % a and i % b and i % c
是条件判断,只有当i
既不能被a
整除,也不能被b
整除,还不能被c
整除时,条件为真。
习题P153-洁净数
题目描述
小明非常不喜欢数字 2,包括那些数位上包含数字 2 的数。如果一个数的数位不包含数字 2,小明将它称为洁净数。
请问在整数 1 至 n 中,洁净数有多少个?
输入描述
输入的第一行包含一个整数 n
输出描述
输出一行包含一个整数,表示答案
print(sum('2' not in str(i) for i in range(1, int(input()) + 1)))
sum(...)
:对生成的布尔值序列进行求和,True
会被当作1
,False
会被当作0
,最终得到洁净数的数量并打印输出。
习题P191-特别数的和
题目描述
小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。
请问,在 1 到 nn 中,所有这样的数的和是多少?
输入描述
输入格式:
输入一行包含两个整数 n(1≤n≤104)n(1≤n≤104)。
输出描述
输出一行,包含一个整数,表示满足条件的数的和。
n = int(input()) SUM = 0 for i in range(n+1): str_n = str(i) contains = False for j in str_n: if j in "2019": contains = True break if contains: SUM += i print(SUM)
n = int(input()) print(sum(i for i in range(1, n + 1) if any(j in '2019' for j in str(i))))
习题P2411-星期几
给定一天是一周中的哪天,请问 n 天后是一周中的哪天?
输入格式
输入第一行包含一个整数 w,表示给定的天是一周中的哪天,w 为 1 到 6 分别表示周一到周六,w为 7 表示周日。
第二行包含一个整数 n。
输出格式
输出一行包含一个整数,表示 n 天后是一周中的哪天,1 到 6 分别表示周一到周六,7表示周日。
w = int(input()) n = int(input()) num = (w + n - 1) % 7 + 1 print(num)
w + n
是计算当前日期加上经过天数后的总天数。
-1
是为了将计数调整为从0
开始,这样(w + n - 1) % 7
的结果范围就是0
到6。
最后
+1
是将结果调整回题目要求的1
到7
的表示方式,其中1
到6
代表周一到周六,7
代表周日 。
二、while语句
练习
求最大公约数
def gcd(a, b): while b: a, b = b, a % b return a
break
和continue
是用于控制循环流程的语句
三、循环嵌套
练习
求阶乘之和
def sum_of_factorials(n): result = 0 for i in range(1, n + 1): factorial = 1 for j in range(1, i + 1): factorial *= j result += factorial return result num = 5 print(f"1到{num}的阶乘之和为: {sum_of_factorials(num)}")
例题3-1 采购
找到满足以下条件的母鸡、公鸡和小鸡的数量:
- 母鸡、公鸡和小鸡的总数为90只。
- 母鸡每只15元,公鸡每只10元,小鸡每只5元,总花费为500元。
count = 0 for x in range(91): for y in range(91): for z in range(91): count += 1 if x+y+z == 90 and 15*x+10*y+5*z == 500: print(x,y,z) print("循环次数 ",count)
优化代码
- 母鸡最多可能有
500 // 15 ≈ 33.33
,取整为 33,循环范围到 34- 公鸡最多可能有
500 // 10 = 50
,循环范围到 51- 将
z = 90 - x - y
代入第二个方程15 * x + 10 * y + 5 * z == 500
中,得到一个只关于x
和y
的方程,减少计算量。count = 0 for x in range(34): for y in range(51): z = 90-x-y count += 1 if x+y+z == 90 and 15*x+10*y+5*z == 500: print(x,y,z) print("循环次数 ",count)
通过数学计算进一步优化
for x in range(6): y = 10 - 2 * x z = 80 + x print(x,y,z)
例题3-2 水仙花数
水仙花数是指一个三位数,其各位数字的立方和等于该数本身。例如,153=13+53+33,所以 153 是一个水仙花数。
for a in range(1, 10): for b in range(0, 10): for c in range(0, 10): num = a * 100 + b * 10 + c if num == a ** 3 + b ** 3 + c ** 3: print(num)
for num in range(100,1000): num100 = (num // 100) num10 = (num // 10) % 10 num1 = num % 10 if num == num100**3 + num10**3 + num1**3: print(num)
例题3-3 素数
如果
n
能被某个i
整除,说明n
不是素数,将prime
设为False
并跳出循环L = int(input()) R = int(input()) for n in range(L,R+1): prime = True if n<= 1: prime = False for i in range(2,int(n**0.5) + 1): if n % i == 0: prime = False break if prime: print(n)
例题3-4 日期
输出2000年至2026年每一天的日期
for year in range(2000, 2026): for month in range(1, 13): if month in [4, 6, 9, 11]: days_in_month = 30 elif month == 2: if (year % 4 == 0 and year % 100!= 0) or (year % 400 == 0): days_in_month = 29 else: days_in_month = 28 else: days_in_month = 31 for day in range(1, days_in_month + 1): print(f"{year}-{month:02d}-{day:02d}")
例题3-5 完美数
一个数字如果等于它的因子之和(不包含它本身),那么这个数字称之为完美数。 例如6=1+2+3,28=1+2+4+7+14。 求出1-n中所有的完美数并输出。
输入:一个整数n(n≤10000)n(n≤10000)
输出:对于每个完美数输出1行
【分析】 枚举1-n中的每个数字,对于这个数字,求出它的所有因子,将其全部加起来判断是否等于本身。
n = int(input()) for num in range(2, n + 1): factor_sum = 0 for factor in range(1, num): if num % factor == 0: factor_sum += factor if factor_sum == num: print(num)