文章目录
- 一、任意进制转十进制
- 1、整数转化成十进制
- (1)二进制转十进制
- (2)八进制转十进制
- 2、小数转化成十进制
- (1)二进制转十进制
- (2)八进制转十进制
- 3、代码
- 1、整数转化成十进制
- 2、小数转化成十进制
- 二、十进制转任意进制
- 1、十进制整数转化成其他进制
- 2、十进制小数转化成其他进制
- 例题
- 1、十进制整数转化成其他进制
- 2、十进制小数转化成其他进制
- 例题
一、任意进制转十进制
基数:表示基本数字符号的个数。
比如十进制就是0-9,基数有10个;十六进制就是0-9、A-F,基数有16个。
权:每一位表示的数值。
比如十进制的8769里8代表8* 1000,7代表7* 100,6代表6* 10,9代表9* 1。这里的千位数代表1000,百位数代表100,十位数代表10,个位数代表1。
权=基数^x,x表示位数(从右往左数,从0开始)
还是以十进制为例子,千位数的权=基数10^3=1000
十进制数=各位数字*权的和
按权展开法: 十进制数 = ∑ i 第 i 位数字 ∗ 第 i 位数字的权 = ∑ i 第 i 位数字 ∗ 基 数 i 十进制数=∑_i第i位数字*第i位数字的权=∑_i第i位数字*基数^i 十进制数=∑i第i位数字∗第i位数字的权=∑i第i位数字∗基数i
1、整数转化成十进制
(1)二进制转十进制
1010 1 2 = 1 × 2 4 + 0 × 2 3 + 1 × 2 2 + 0 × 2 1 + 1 × 2 0 = 16 + 0 + 4 + 0 + 1 = 21 10101_2=1\times2^4+0\times2^3+1\times2^2+0\times2^1+1\times2^0=16+0+4+0+1=21 101012=1×24+0×23+1×22+0×21+1×20=16+0+4+0+1=21
(2)八进制转十进制
257 3 8 = 2 × 8 3 + 5 × 8 2 + 7 × 8 1 + 3 × 8 0 = 1403 2573_8=2\times8^3+5\times8^2+7\times8^1+3\times8^0=1403 25738=2×83+5×82+7×81+3×80=1403
2、小数转化成十进制
(1)二进制转十进制
1101.100 1 2 = 1 × 2 3 + 1 × 2 2 + 0 × 2 1 + 1 × 2 0 + 1 × 2 − 1 + 0 × 2 − 2 + 0 × 2 − 3 + 1 × 2 − 4 = 8 + 4 + 0 + 1 + 1 / 2 + 0 + 0 + 1 / 16 = 13.5625 1101.1001_2=1\times2^3+1\times2^2+0\times2^1+1\times2^0+1\times2^{-1}+0\times2^{-2}+0\times2^{-3}+1\times2^{-4}=8+4+0+1+1/2+0+0+1/16=13.5625 1101.10012=1×23+1×22+0×21+1×20+1×2−1+0×2−2+0×2−3+1×2−4=8+4+0+1+1/2+0+0+1/16=13.5625
(2)八进制转十进制
573.1 2 8 = 5 × 8 2 + 7 × 8 1 + 3 × 8 0 + 1 × 8 − 1 + 2 × 8 − 2 = 320 + 56 + 3 + 1 / 8 + 1 / 32 = 379.15625 573.12_8=5\times8^2+7\times8^1+3\times8^0+1\times8^{-1}+2\times8^{-2}=320+56+3+1/8+1/32=379.15625 573.128=5×82+7×81+3×80+1×8−1+2×8−2=320+56+3+1/8+1/32=379.15625
3、代码
1、整数转化成十进制
写法1
def k_to_ten(k,x):
ans=0
for i in list(x):
ans=ans*k+int(i)
return ans
print(k_to_ten(8,"2573"))
# 1403
print(k_to_ten(2,"10101"))
# 21
写法2
int_to_char="0123456789ABCDEF"
char_to_int={}
for i in range(16):
char_to_int[int_to_char[i]]=i
def k_to_ten(k,x):
ans=0
for i in x:
ii=char_to_int[i]
ans=ans*k+ii
return ans
print(k_to_ten(8,"2573"))
写法3
int_to_char="0123456789ABCDEF"
char_to_int={}
for i in range(16):
char_to_int[int_to_char[i]]=i
def k_to_ten(k,x):
ans=0
length=len(x)
for index,char in enumerate(list(x)):
ii=char_to_int[char]
ans+=ii*k**(length-index-1)
return ans
print(k_to_ten(2,"10101"))
2、小数转化成十进制
int_to_char="0123456789ABCDEF"
char_to_int={}
for i in range(16):
char_to_int[int_to_char[i]]=i
def k_to_ten(k,x):
# 把x分成正数和小数
x=x.split('.')
ans=0
for index,char in enumerate(list(x[0])):
length=len(x[0])
ii=char_to_int[char]
ans+=ii*k**(length-index-1)
for index,char in enumerate(list(x[1])):
ii=char_to_int[char]
ans+=ii*k**(-(index+1))
return ans
print(k_to_ten(8,"573.12"))
# 379.15625
二、十进制转任意进制
除k取余法:十进制数字不断除以k求余数,然后逆序输出。
之前已经知道了 十进制数 = ∑ i 第 i 位数字 ∗ 第 i 位数字的权 = ∑ i 第 i 位数字 ∗ 基 数 i 十进制数=∑_i第i位数字*第i位数字的权=∑_i第i位数字*基数^i 十进制数=∑i第i位数字∗第i位数字的权=∑i第i位数字∗基数i,那么除以基数k就可以以低位到高位的顺序得到基数。
以把十进制的99转化成二进制为例子:
99/2=49……1
49/2=24……1
24/2=12……0
12/2=6……0
6/2=3……0
3/2=1……1
1/2=0……1
所以
9
9
10
=
0110001
1
2
所以99_{10}=0110 0011_2
所以9910=011000112
1、十进制整数转化成其他进制
还是以是十进制数99为例:
9 9 10 = 0110001 1 2 99_{10}=0110 0011_2 9910=011000112
99/2=49……1
49/2=24……1
24/2=12……0
12/2=6……0
6/2=3……0
3/2=1……1
1/2=0……1
99=1*2**6+1*2**5+0*2**4+0*2**3+0*2**2+1*2**1+1*2**0
9 9 10 = 14 3 8 99_{10}=143_8 9910=1438
99/8=12……3
12/8=1……4
1/8=0……1
99=1*8**2+4*8**1+3*8**0
9 9 10 = 6 3 16 99_{10}=63_{16} 9910=6316
99/16=6……3
6/16……6
99=6*16**1+6*16**0
2、十进制小数转化成其他进制
除k取整法:十进制小数转k进制,乘以k求整数,然后顺序输出。
0.62 5 10 = 0.10 1 2 0.625_{10}=0.101_2 0.62510=0.1012
例题
1、十进制整数转化成其他进制
input: 十进制int
output: k进制整数
int_to_char="0123456789"
def ten_to_k(k,x):
ans=[]
if x==0:
ans.append(0)
return
while x:
ans.append(x%k)
x=x//k
ans.reverse()
print(ans)
for i in ans:
print(int_to_char[i],end="")
return
ten_to_k(8,99)
# 143
input: 十进制int
output: k进制列表
int_to_char="0123456789"
def ten_to_k(k,x):
ans=[]
if x==0:
ans.append(0)
return ans
while x:
ans.append(x%k)
x=x//k
ans.reverse()
return ans
print(ten_to_k(8,99))
# [1,4,3]
2、十进制小数转化成其他进制
int_to_char="0123456789"
def ten_to_k(k,x):
x=str(x)
# 把x分成正数和小数
x=x.split('.')
x=[int(x[0]),int(x[1])/10**len(x[1])]
ans=[[],[]]
if x[0]==0:
ans[0].append(0)
while x[0]:
ans[0].append(x[0]%k)
x[0]=x[0]//k
ans[0].reverse()
while x[1]:
# 依次乘k
zs=x[1]*k
# 取整数部分
ans[1].append(int(zs//1))
x[1]=zs-zs//1
all=[''.join([int_to_char[i] for i in ans[0]]),'.']+[''.join([int_to_char[i] for i in ans[1]])]
return all
print(ten_to_k(2,0.625))
# ['0', '.', '101']
例题
lanqiao1230 进制转换
lanqiao2095 九进制转十进制
lanqiao2489 进制