Python基础编程挑战:从循环到算法,一文通关15道经典题

📅 2026/7/21 6:34:47
Python基础编程挑战:从循环到算法,一文通关15道经典题
为什么别人写的代码简洁又高效为什么面试总考这些看似简单的题—— 因为它们是编程思维的基石。今天我们用15道经典题目彻底吃透 Python 中的循环、条件、数论、斐波那契等核心知识让你的基础变得坚不可摧 写在前面如果你正在学习 Python你一定遇到过这些题目九九乘法表、质数判断、斐波那契数列、最大公约数……它们看似“老生常谈”却是编程思维和算法能力的最佳试金石。能否熟练运用while和for灵活解题直接体现了你对控制流的掌握程度。本文精选了 13 道必会题 2 道综合题每道题都给出for和while两种实现思路并附关键代码和易错提醒。读完这篇你将收获✅ 循环结构for / while的灵活切换✅ 条件判断、标志位的正确使用✅ 数论基础质数、公约数、公倍数✅ 斐波那契数列、阶乘等经典算法✅ 图形打印的循环技巧准备好开启这次硬核闯关了吗Lets go1️⃣ 打印 9×9 乘法表要求输出上三角或下三角形式的九九乘法表。思路外层循环控制行1~9内层循环控制列1~行数。利用print的end参数不换行行末再换行。for 实现下三角pythonfor i in range(1, 10): for j in range(1, i 1): print(f{j}×{i}{i*j}, end\t) print()while 实现下三角pythoni 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 ij 10) or (i j and ij 10)左右漏斗(i j and ij 10) or (i j and ij 10)for 实现上下漏斗pythonfor 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 实现左右漏斗pythoni 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 的所有整数。forpythonn int(input(请输入一个数)) fact 1 for i in range(1, n 1): fact * i print(f{n}! {fact})whilepythoni 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。forpythonn int(input(请输入一个数)) total 0 fact 1 for i in range(1, n 1): fact * i # 当前 i 的阶乘 total fact print(f阶乘和为{total})whilepythoni 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个数的和”。forpythonnums [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无需全部存储分别收集pythonnums [] 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 均可这里用 whilepythona 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否则为质数。whilepythonnum int(input(请输入一个数)) i 2 while i num: if num % i 0: print(f{num} 不是质数最大因数为 {num // i}) break i 1 else: print(f{num} 是质数)forpythonfor 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*100b*10c) // 11 abc且必须整除即商为整数其实//已取整需检查余数为0。forpythonfor 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,...思路迭代更新前两项。forpythonn int(input(求第几项)) a, b 1, 1 if n 2: print(1) else: for _ in range(3, n1): a, b b, ab print(b)whilepythoni 3 while i n: a, b b, ab i 1 print(b) 求 1000 以内有几个质数思路遍历 2~1000判断每个数是否为质数。优化只需检查到平方根。for 实现含计数pythoncount 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(f1000以内有 {count} 个质数)while版本类似只需把外层和内层改为while。1️⃣1️⃣ 求 1000 以内最大的 10 个质数的平均数思路从 1000 向下遍历找到质数就累加直到凑够 10 个。forpythontotal 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, p6) 均为质数思路先收集所有质数然后从大到小检查相邻差为 6 的配对但注意不一定是相邻的质数只要二者差6即可。最简单从1000向下找满足is_prime(p) and is_prime(p-6)的 p直到找到10对。示例代码pythondef 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 关键字列表。pythonimport keyword print(keyword.kwlist) # 所有关键字 print(keyword.iskeyword(if)) # Truerandom 模块生成随机数。pythonimport random print(random.randint(1, 10)) # 随机整数 print(random.choice([a,b,c])) # 随机选取 print(random.sample(range(100), 5)) # 不重复采样time 模块时间处理。pythonimport time print(time.time()) # 当前时间戳 print(time.localtime()) # 结构化时间 time.sleep(1) # 暂停1秒 结语编程能力的跃升这 13 道题涵盖了 Python 基础编程的绝大部分核心知识点。多写、多调试、多对比你会在不知不觉中建立起强大的逻辑思维。记住while和for只是工具真正重要的是你如何用它们表达算法。如果你对某道题还有更好的解法欢迎留言讨论。也别忘了收藏本文方便日后复习。 最后一个小彩蛋几乎所有题目都可以用一行列表推导式或递归实现但这要求扎实的基础。先把基础练好再去追求“炫技”吧原创文章未经授权禁止转载。如果觉得有帮助点个赞再走吧