Python实现十进制和二进制、八进制、十六进制的相互转换
1. 前言
此文方便后期的复习,如果有问题,欢迎批评指正。
2. 实现思想
2.1 十进制转换为其他进制
原理:除以进制数(base)取余,逆序输出。
举例:将16转换为2进制形式
- 16除以2取余,得到余数0,存入结果(这个是最低位,
- 将16//2 得到8
- 不断重复1和2,直到n <= 0
以下分别用内置函数bin(),不用内置函数、借用栈等方法进行了实现。
代码实现
def my_bin(n):
""" 十进制转二进制, 调用内置函数"""
return bin(n)
def my_bin2(n):
"""十进制转二进制, 原理:除2取余,逆序排列输出"""
ans = list()
while n > 0:
res = n % 2
ans.append(str(res)) # 要转为字符串,便于后面join()方法
n //= 2
ans.reverse()
ans = ''.join(ans)
return ans
def base_convert(n, base):
"""通用十进制转为二进制、八进制、十六进制等"""
digit = '0123456789ABCEFG'
ans = list()
while n > 0:
res = n % base
ans.append(digit[res]) # 也可以构造字典进行取数
n //= base
ans.reverse() # 内置方法反转,或者用切片 ans = ans[::-1]
ans = ''.join(ans)
return ans
class Stack:
"""Python实现一个栈"""
def __init__(self):
"""初始化一个列表"""
self.items = []
def is_empty(self):
"""栈是否为空"""
return self.items == []
def push(self, n):
"""入栈"""
self.items.append(n)
def pop(self):
"""出栈"""
return self.items.pop()
def peek(self):
"""取出最后一个数"""
return self.items[len(self.ites)-1]
def size(self):
"""栈中元素多少"""
return len(self.items)
def base_converter3(n, base):
"""利用栈,将十进制转换为其他进制"""
digits = '0123456789ABCDEF'
s = Stack()
ans = ''
while n > 0:
rem = n % base
s.push(rem)
n //= base
while not s.is_empty():
ans += digits[s.pop()]
return ans
if __name__ == '__main__':
n, base = tuple(map(int, input().strip().split()))
print(my_bin(n))
print(my_bin2(n))
n = int(input())
base = int(input())
print(base_converter3(n, base))
2.2 其他进制转换为十进制
原理:遍历进制的每一位,同时乘以相应的进制位数,累计求和
代码实现:
def base_convert2(s, base):
"""二进制、八进制、十六进制转十进制。原理:每一位乘以相应base的次方,累计求和"""
s = s[::-1] # 字符串反转
ans = 0
j = 0
for i in s:
ans += int(i) * base ** j
j += 1
return ans