Python基础编程挑战:从循环到算法,一文通关15道经典题
为什么别人写的代码简洁又高效?为什么面试总考这些看似简单的题?—— 因为它们是编程思维的基石。今天,我们用15道经典题目,彻底吃透 Python 中的循环、条件、数论、斐波那契等核心知识,让你的基础变得坚不可摧!
📌 写在前面
如果你正在学习 Python,你一定遇到过这些题目:九九乘法表、质数判断、斐波那契数列、最大公约数……它们看似“老生常谈”,却是编程思维和算法能力的最佳试金石。能否熟练运用while和for灵活解题,直接体现了你对控制流的掌握程度。
本文精选了 13 道必会题 + 2 道综合题,每道题都给出for和while两种实现思路,并附关键代码和易错提醒。读完这篇,你将收获:
✅ 循环结构(for / while)的灵活切换
✅ 条件判断、标志位的正确使用
✅ 数论基础(质数、公约数、公倍数)
✅ 斐波那契数列、阶乘等经典算法
✅ 图形打印的循环技巧
准备好开启这次硬核闯关了吗?Let's go!💪
1️⃣ 打印 9×9 乘法表
要求:输出上三角或下三角形式的九九乘法表。
思路:外层循环控制行(1~9),内层循环控制列(1~行数)。利用print的end参数不换行,行末再换行。
for 实现(下三角):
python
for i in range(1, 10): for j in range(1, i + 1): print(f"{j}×{i}={i*j}", end="\t") print()while 实现(下三角):
python
i = 1 while i <= 9: j = 1 while j <= i: print(f"{j}×{i}={i*j}", end="\t") j += 1 print() i += 1💡 上三角只需改内循环为
range(i, 10)即可。
2️⃣ 使用循环嵌套打印各种三角图形(上下漏斗,左右漏斗)
要求:在 9×9 网格中打印星号构成的上/下漏斗、左/右漏斗图案。
核心:根据行索引i和列索引j的关系,决定输出*还是空格。四种漏斗的条件分别如下:
| 漏斗类型 | 打印*的条件 |
|---|---|
| 上下漏斗 | (i <= j and i+j <= 10) or (i >= j and i+j >= 10) |
| 左右漏斗 | (i >= j and i+j <= 10) or (i <= j and i+j >= 10) |
for 实现(上下漏斗):
python
for i in range(1, 10): for j in range(1, 10): if (i <= j and i + j <= 10) or (i >= j and i + j >= 10): print("*", end=" ") else: print(" ", end=" ") print()while 实现(左右漏斗):
python
i = 1 while i <= 9: j = 1 while j <= 9: if (i >= j and i + j <= 10) or (i <= j and i + j >= 10): print("*", end=" ") else: print(" ", end=" ") j += 1 print() i += 13️⃣ 输入一个数,计算该数的阶乘(如 5! = 5×4×3×2×1)
思路:累乘从 1 到 n 的所有整数。
for:
python
n = int(input("请输入一个数:")) fact = 1 for i in range(1, n + 1): fact *= i print(f"{n}! = {fact}")while:
python
i = 1 fact = 1 while i <= n: fact *= i i += 1 print(f"{n}! = {fact}")4️⃣ 输入一个数,计算该数的阶乘和(如 5 = 5! + 4! + 3! + 2! + 1!)
思路:在外层循环中累加每个数的阶乘,可复用阶乘计算。优化:利用前一个阶乘值,fact_i = fact_{i-1} * i。
for:
python
n = int(input("请输入一个数:")) total = 0 fact = 1 for i in range(1, n + 1): fact *= i # 当前 i 的阶乘 total += fact print(f"阶乘和为:{total}")while:
python
i = 1 fact = 1 total = 0 while i <= n: fact *= i total += fact i += 1 print(f"阶乘和为:{total}")5️⃣ 输出 100~200 之间不能被 3 整除的最大的 20 个数与最小的 20 个数的差值
思路:分别收集符合条件的数,排序后取前 20 和后 20,计算差值(最大20个的和/均值减去最小20个的和/均值,题目未明确,常见理解为“和差”或“最大最小之差”,但更合理是分别求和相减)。这里采用“最大20个数的和 - 最小20个数的和”。
for:
python
nums = [i for i in range(100, 201) if i % 3 != 0] min_20 = nums[:20] max_20 = nums[-20:] # 因列表已升序 diff = sum(max_20) - sum(min_20) print(f"差值为:{diff}")while(无需全部存储,分别收集):
python
nums = [] i = 100 while i <= 200: if i % 3 != 0: nums.append(i) i += 1 min_20 = nums[:20] max_20 = nums[-20:] print(sum(max_20) - sum(min_20))
6️⃣ 输入两个数,求最大公约数和最小公倍数
思路:最大公约数可用辗转相除法(欧几里得算法),最小公倍数 = 两数乘积 / 最大公约数。
for / while 均可,这里用 while:
python
a = int(input("第一个数:")) b = int(input("第二个数:")) m, n = a, b while n != 0: m, n = n, m % n gcd = m lcm = a * b // gcd print(f"最大公约数:{gcd},最小公倍数:{lcm}")⚠️ 也可用枚举法(从较小的数递减),但辗转相除效率更高。
7️⃣ 输入一个数字,如果是质数则打印该数,否则打印该数最大的因数
思路:从 2 开始试除,找到第一个因子则不是质数,最大因数为num // i;否则为质数。
while:
python
num = int(input("请输入一个数:")) i = 2 while i < num: if num % i == 0: print(f"{num} 不是质数,最大因数为 {num // i}") break i += 1 else: print(f"{num} 是质数")for:
python
for i in range(2, num): if num % i == 0: print(f"{num} 不是质数,最大因数为 {num // i}") break else: print(f"{num} 是质数")8️⃣ 编程求出满足以下条件的三位数:它除以 11 所得的商等于它各位数字之和
思路:遍历 100~999,设三位数为abc,则(a*100+b*10+c) // 11 == a+b+c,且必须整除(即商为整数,其实//已取整,需检查余数为0)。
for:
python
for n in range(100, 1000): a = n // 100 b = (n // 10) % 10 c = n % 10 if n % 11 == 0 and n // 11 == a + b + c: print(n)
9️⃣ 斐波那契数列:求第 n 项(1,1,2,3,5,8,...)
思路:迭代更新前两项。
for:
python
n = int(input("求第几项:")) a, b = 1, 1 if n <= 2: print(1) else: for _ in range(3, n+1): a, b = b, a+b print(b)while:
python
i = 3 while i <= n: a, b = b, a+b i += 1 print(b)
🔟 求 1000 以内有几个质数
思路:遍历 2~1000,判断每个数是否为质数。优化:只需检查到平方根。
for 实现(含计数):
python
count = 0 for num in range(2, 1001): for i in range(2, int(num**0.5) + 1): if num % i == 0: break else: count += 1 print(f"1000以内有 {count} 个质数")while版本类似,只需把外层和内层改为while。
1️⃣1️⃣ 求 1000 以内最大的 10 个质数的平均数
思路:从 1000 向下遍历,找到质数就累加,直到凑够 10 个。
for:
python
total = 0 count = 0 for num in range(1000, 1, -1): for i in range(2, int(num**0.5) + 1): if num % i == 0: break else: total += num count += 1 if count == 10: break print(f"平均数为:{total / count}")1️⃣2️⃣ 求 1000 以内相差为 6 的最大的 10 个质数对(即 (p, p+6) 均为质数)
思路:先收集所有质数,然后从大到小检查相邻差为 6 的配对(但注意不一定是相邻的质数,只要二者差6即可)。最简单:从1000向下,找满足is_prime(p) and is_prime(p-6)的 p,直到找到10对。
示例代码:
python
def is_prime(n): if n < 2: return False for i in range(2, int(n**0.5)+1): if n % i == 0: return False return True pairs = [] p = 1000 while len(pairs) < 10 and p > 6: if is_prime(p) and is_prime(p-6): pairs.append((p-6, p)) p -= 1 print("相差6的质数对(从大到小):", pairs)这里我们求的是“最大的10个质数对”,即两个数本身都尽可能大。
1️⃣3️⃣ 综合:模块方法汇总(keyword, random, time)
题目第一项要求汇总三个模块的所有方法,并附注释与案例。由于篇幅,这里只展示核心方法和常用案例,完整列表可使用
dir(module)查看。
keyword 模块:查看 Python 关键字列表。
python
import keyword print(keyword.kwlist) # 所有关键字 print(keyword.iskeyword('if')) # Truerandom 模块:生成随机数。
python
import random print(random.randint(1, 10)) # 随机整数 print(random.choice(['a','b','c'])) # 随机选取 print(random.sample(range(100), 5)) # 不重复采样
time 模块:时间处理。
python
import time print(time.time()) # 当前时间戳 print(time.localtime()) # 结构化时间 time.sleep(1) # 暂停1秒
🎯 结语:编程能力的跃升
这 13 道题涵盖了 Python 基础编程的绝大部分核心知识点。多写、多调试、多对比,你会在不知不觉中建立起强大的逻辑思维。记住:while和for只是工具,真正重要的是你如何用它们表达算法。
如果你对某道题还有更好的解法,欢迎留言讨论。也别忘了收藏本文,方便日后复习。
🔥 最后一个小彩蛋:几乎所有题目都可以用一行列表推导式或递归实现,但这要求扎实的基础。先把基础练好,再去追求“炫技”吧!
原创文章,未经授权禁止转载。如果觉得有帮助,点个赞再走吧!👍