
本文讲解如何在严格限制条件下(仅1个for循环、不使用字符串、无额外库)生成如1/22/333/4444的数字重复图案,并彻底解决用户代码中首行输出多余0的问题。
本文讲解如何在严格限制条件下(仅1个for循环、不使用字符串、无额外库)生成如1/22/333/4444的数字重复图案,并彻底解决用户代码中首行输出多余0的问题。
在Python中生成形如
1 22 333 4444
的数字重复图案时,若受限于“仅1个for循环、禁止字符串操作、禁止导入库、用户输入控制行数”,一个常见思路是利用数学规律构造重复数字:n 个数字 d 可表示为 (10ⁿ − 1) // 9 × d。例如,333 = (10³ − 1) // 9 × 3 = 111 × 3。
但原始实现:
for i in range(int(input())):
print(((10**i)//9)*i)
会输出:
0 ← 多余!因 i=0 时:(10⁰//9)*0 = (1//9)*0 = 0*0 = 0 1 22 333 4444
问题根源在于 range(n) 从 0 开始,而 i=0 既导致乘法结果为 0,又使 (10⁰//9) 退化为 0(整除下 1//9 == 0),双重作用产生首行冗余零。
✅ 正确解法有两种等效方式:
方案一:调整 range 起始值(推荐)
将循环改为从 1 开始,上界设为 n+1:
n = int(input())
for i in range(1, n + 1):
print(((10 ** i) // 9) * i)
✔ 逻辑清晰,语义明确(i 直接代表当前行号与数字),避免 0 参与计算。
方案二:循环内偏移索引
保持 range(n),但在表达式中统一 +1:
n = int(input())
for i in range(n):
print(((10 ** (i + 1)) // 9) * (i + 1))
✔ 本质同方案一,适合需保留原始循环结构的场景。
? 关键注意事项:
-
10**i在i=0时为1,但1//9 == 0(整数除法向零取整),因此必须规避i=0; - 不使用字符串(如
str(i)*i)是本题硬性要求,上述解法纯靠算术,完全合规; - 输入
5将输出 5 行:1,22,333,4444,55555,符合题目隐含的“行数=输入值”逻辑; - 所有操作均基于内置函数与基础运算,无需
import。
总结:核心在于理解 range 的起始行为与整数除法特性。只要确保参与计算的索引从 1 开始,即可优雅避开首零陷阱,同时满足全部约束条件。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











