
题目考点
这道题主要考 4 个点:
for循环:从1打印到number- 进制转换:十进制、八进制、十六进制、二进制
- 字符串右对齐:让每一列宽度一致
- 函数封装:补全
print_formatted(number)函数
这道题不是考复杂算法,核心是:把每个数字转换成不同进制,然后按统一宽度对齐输出。
审题
题目给你一个整数 number,要求你对从 1 到 number 的每一个整数 i,打印四个值:
十进制 八进制 十六进制 二进制
例如 i = 10 时:
10 12 A 1010
因为:
10 的十进制是 10
10 的八进制是 12
10 的十六进制是 A
10 的二进制是 1010
题目还有一个关键要求:
每一列都要按照
number的二进制长度进行右对齐。
也就是说,列宽不是随便定的,而是由最大数字 number 的二进制位数决定。
例如样例中:
number = 17
17 的二进制是:
10001
长度是 5。
所以所有列都要按照宽度 5 右对齐。
思路提示
先不要急着写完整代码,先把题目拆开看。
第一步,先求出“统一宽度”。
因为题目说宽度要和 number 的二进制长度一致,所以可以先把 number 转成二进制字符串:
format(number, 'b')
比如:
format(17, 'b')
结果是:
10001
然后取长度:
width = len(format(number, 'b'))
第二步,用循环从 1 遍历到 number:
for i in range(1, number + 1):
第三步,把当前数字 i 转成不同进制:
decimal = str(i)
octal = format(i, 'o')
hexa = format(i, 'X')
binary = format(i, 'b')
这里注意:
format(i, 'o')
表示转成八进制。
format(i, 'X')
表示转成大写十六进制。
format(i, 'b')
表示转成二进制。
第四步,把四个字符串都右对齐到同样宽度:
decimal.rjust(width)
最后用一个空格连接并打印。
完整设计思路
这道题可以拆成 4 个步骤。
第一步:确定列宽
题目要求所有值都要按照 number 的二进制宽度对齐。
所以:
width = len(format(number, 'b'))
如果 number = 17:
format(17, 'b') # '10001'
长度是 5,所以 width = 5。
第二步:遍历 1 到 number
题目要求对每个整数 i 都打印一行。
所以需要:
for i in range(1, number + 1):
注意,range(1, number + 1) 才能包含 number 本身。
如果写成:
range(1, number)
最后一个数字就不会打印。
第三步:转换不同进制
Python 中可以用 format() 做进制转换:
| 写法 | 含义 | 例子 |
|---|---|---|
format(i, 'd') | 十进制 | 10 |
format(i, 'o') | 八进制 | 12 |
format(i, 'x') | 小写十六进制 | a |
format(i, 'X') | 大写十六进制 | A |
format(i, 'b') | 二进制 | 1010 |
这道题要求十六进制大写,所以要用:
format(i, 'X')
第四步:右对齐输出
题目要求每一列宽度一样,所以可以用字符串方法:
rjust(width)
例如:
'1'.rjust(5)
结果相当于:
1
前面补空格,总长度变成 5。
所以每一列都这样处理:
decimal.rjust(width)
octal.rjust(width)
hexa.rjust(width)
binary.rjust(width)
代码实现
这是适合初学者理解的写法:
def print_formatted(number):
width = len(format(number, 'b'))
for i in range(1, number + 1):
decimal = str(i)
octal = format(i, 'o')
hexa = format(i, 'X')
binary = format(i, 'b')
print(
decimal.rjust(width),
octal.rjust(width),
hexa.rjust(width),
binary.rjust(width)
)
if __name__ == '__main__':
n = int(input().strip())
print_formatted(n)
模板代码解释
题目中的这段代码:
if __name__ == '__main__':
n = int(input().strip())
print_formatted(n)
你可以先理解成固定输入模板。
其中:
input()
读取用户输入,得到的是字符串。
strip()
去掉输入前后的空格和换行。
int()
把字符串转成整数。
所以:
n = int(input().strip())
意思就是:
读取一个整数 n
然后:
print_formatted(n)
表示调用我们自己写的函数,让它完成打印任务。
运行演示
假设输入:
5
第一步,计算宽度:
format(5, 'b')
结果是:
101
所以:
width = 3
然后循环打印:
当 i = 1:
decimal = '1'
octal = '1'
hexa = '1'
binary = '1'
都右对齐到宽度 3:
1 1 1 1
当 i = 2:
decimal = '2'
octal = '2'
hexa = '2'
binary = '10'
右对齐后:
2 2 2 10
当 i = 5:
decimal = '5'
octal = '5'
hexa = '5'
binary = '101'
二进制刚好是 3 位:
5 5 5 101
完整输出大致是:
1 1 1 1
2 2 2 10
3 3 3 11
4 4 4 100
5 5 5 101
另一种更简洁的写法
等你熟悉以后,也可以用 f-string 格式化:
def print_formatted(number):
width = len(format(number, 'b'))
for i in range(1, number + 1):
print(f"{i:>{width}d} {i:>{width}o} {i:>{width}X} {i:>{width}b}")
if __name__ == '__main__':
n = int(input().strip())
print_formatted(n)
这里:
{i:>{width}d}
可以理解为:
把 i 按十进制显示,并且右对齐到 width 宽度
不过对初学者来说,前面那种 rjust() 写法更直观。
方法总结
这类题的下手方法是:
先找“每一行要输出什么”,再找“输出格式有什么特殊要求”。
这道题每一行要输出的是:
十进制 八进制 十六进制 二进制
特殊格式要求是:
所有列都要右对齐,宽度等于 number 的二进制长度
所以核心代码逻辑就是:
width = len(format(number, 'b'))
for i in range(1, number + 1):
转换进制
右对齐
打印
以后遇到类似“打印表格”“对齐输出”“格式化输出”的题,优先想到:
rjust()
或者:
f-string 格式化
小练习
题目:
给定一个整数 n,对于从 1 到 n 的每个整数 i,打印三列:
i 的十进制 i 的平方 i 的立方
要求三列都按照 n^3 的位数右对齐。
例如输入:
5
需要打印类似:
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
提示:
先计算最大宽度:
width = len(str(n ** 3))
然后用循环依次打印:
i
i ** 2
i ** 3
每一列都用 rjust(width) 右对齐。



