这两天帮同学解了一些题目,这里总结一下算法。
0x00 题目
请写一个 Python 程序实现实数的「三位一并法」与「四位一并法」。输入一个八进制小数,利用三位一并法将其转换为二进制实数,并输出,再利用四位一并法将上一步得到的二进制实数转换为十六进制实数,并输出。e.g. 输入 2.04(8) 输出 010.00100(2) 和 2.1(16)。
0x01.知识储备
二进制与八进制数之间的对应关系
二进制数 | 八进制数 |
000 | 0 |
001 | 1 |
010 | 2 |
011 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
八进制转二进制的方法是三位一并法的逆用
八进制数 | 1 | 6 | . | 7 | 1 |
二进制数 | 001 | 110 | . | 111 | 001 |
二进制转化为十进制的方法是,三位一并法
举个栗子 010.000100(2) 的转化,以小数点为界,整数和小数部分内每三位数为一组进行分组进行转化。
二进制数 | 010 | . | 000 | 100 |
八进制数 | 2 | . | 0 | 4 |
那如果分组时无法凑足三位,则需要进行补位
举个栗子 1010.0001001(2) 的转化,对整数部分,在最左边补充0,对于小数部分,在最右边补充0,即:
二进制 | 001 | 010 | . | 000 | 100 | 100 |
八进制 | 1 | 2 | . | 0 | 4 | 4 |
0x02 Python 的实现
# coding=utf-8
print('请输入一个八进制小数:')
oct_num = input()
binary = ''
is_minus = False
# 三位一并法逆用: 8进制小数转2进制小数
for o in oct_num:
if o == '.':
binary += '.'
elif o == '-':
# 处理负数
binary += ''
is_minus = True
else:
binary += format(int(o), '03b') # 格式化字符串,强制宽度为3字节
# 负数处理
sym = '-' if is_minus is True else ''
print(sym + binary)
文章最后修订于 2020年8月31日
评论 (0)