跳转至

PIO15 单组_补充前导零

入门通过率 84.83%python3样例通过牛客 AC

牛客原题  源码

讲解章节输入输出处理

一句话

读入一个正整数,补足 9 个数位后输出。

解题思路

这题考什么

输入形态:单组数据,一行一个整数。考点同样落在输出格式上: 位数不足 9 位时在左边补零,正好 9 位时原样输出。

做法是把输入当字符串处理,压根不转成整数: 读进来是什么样,除了补零之外不做任何改动。 zfill(9) 的语义是「左侧补 0 直到总长度达到 9」, 已经够长时它什么也不做——只补不截,所以 9 位的输入会原样保留。

与其他写法相比

格式化 "%09d" 或 f-string 的 09d 也能得到同样结果, 但它们要先把字符串转成 int 再转回字符串,多绕一圈; 而 zfill 的名字直接说出了「zero fill」这件事,对入门读者更直白。 真正要小心的是自己写循环拼 "0":字符串不可变,每次拼接都要整体复制, 虽然本题只有 9 位无所谓,但这个习惯在长串上就是 O(n^2)。

数据规模与复杂度

1 <= n < 1e9,所以十进制最多 9 位,zfill(9) 永远不会发生截断。 时间和空间都是 O(1)。

坑在哪

  1. strip() 不能省。行尾残留的空白字符会被算进字符串长度, zfill 会因此少补一个零,输出变成 8 位有效数字加一个杂字符。
  2. zfill 对符号位有特殊处理:它会把补的零插在符号之后, "-12".zfill(5) 得到 "-0012" 而不是 "000-12"。本题 n 为正整数用不上, 但换成可能有负数的题面时,这个行为决定了要不要单独处理符号。
  3. 题目上界是严格小于 1e9,正好卡住 9 位; 如果换成 n <= 1e9,1000000000 有 10 位,zfill(9) 不会截断, 会输出 10 位——这时就得回头看题目到底要不要截断。

参考实现

solutions/PIO15.py
# 全程按字符串处理,不转 int;zfill 只在左侧补零、绝不截断,故 9 位输入原样保留
print(input().strip().zfill(9))
[:octicons-arrow-left-16: PIO14](PIO14.md) [PIO16 :octicons-arrow-right-16:](PIO16.md)