进制转换:十进制、八进制、十六进制、二进制

题目考点

这道题主要考 4 个点:

  1. for 循环:从 1 打印到 number
  2. 进制转换:十进制、八进制、十六进制、二进制
  3. 字符串右对齐:让每一列宽度一致
  4. 函数封装:补全 print_formatted(number) 函数

这道题不是考复杂算法,核心是:把每个数字转换成不同进制,然后按统一宽度对齐输出。


审题

题目给你一个整数 number,要求你对从 1number 的每一个整数 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,对于从 1n 的每个整数 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) 右对齐。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇