引言
进制转换是计算机数据处理的基础,二进制是计算机原理中最基本的概念,十进制是人类常用的数值概念,因此,进制的转换是人类与计算机交互的最基础的算法
进制转换原理
方法:除以K求余数
转换过程中,得到的余数是从低到高的次序,而输出是从高到低的输出,所以需要一个栈来反转次序。
十进制转换为二进制实现
1.1 定义栈的各种属性
class Stack(object): #定义栈 类
"""栈"""
def __init__(self):
self.items = []
def is_empty(self):
"""判断是否为空"""
return self.items == []
def push(self, item):
"""加入元素"""
self.items.append(item)
def pop(self):
"""弹出元素"""
return self.items.pop()
def peek(self):
"""返回栈顶元素"""
return self.items[len(self.items)-1]
def size(self):
"""返回栈的大小"""
return len(self.items)
1.2 10转2进制实现
## 十进制转换为二进制
def divideby2(decnumber):
remstack= Stack()
while decnumber >0:
rem=decnumber % 2 #求余数
remstack.push(rem)
decnumber=decnumber//2 ##整除数
binstring=""
while not remstack.is_empty():
binstring=binstring+str(remstack.pop())
return binstring
print(divideby2(42))
十进制转换为任意进制实现
## 十进制转换为十六一下任意进制: 代码实现
def baseconverter(decnumber,base): ##decnumber为转换数, base为任意进制数值
digits="0123456789ABCDEF"
remstack=Stack()
while decnumber >0:
rem=decnumber % base #求余数
remstack.push(rem)
decnumber=decnumber//base #取整数
newstring=""
while not remstack.is_empty():
newstring=newstring+digits[remstack.pop()]
return newstring
测试结果:
print(baseconverter(25,2))
print(baseconverter(2225,16))
11001
8B1
问题拓展
进制的转换也可通过递归算法来实现
- 基本结束条件:小于十的整数
- 问题分解为小问题:用整数除和求余数将问题一步步分开
余数总小于“进制基base”,是小问题的基本结束条件
3.调用自身:整数商成为“更小规模”问题,通过调用自身解决
代码实现:
def tosre(n,base):
converstring="0123456789ABCDEF"
if n <base:
return converstring
else:
return tosre(n//base,base)+converstring[n%base]
print(tosre(11453,16))