将n位2进制字符串转换为10进制字符串的办法(不直接转化成整数)

时间:2023-01-07 09:03:20

正常办法是直接转换成整数,然后再计算10进制,但是注意:如果这个2进制代表的整数很大超出了计算机的表示范围怎么办?一个比较好的办法就是直接计算十进制的每一位.设二进制的表示为bnbn-1..b0,那么第j个十进制就是dj = [sum(bi*2^i/10^j)]mod 10。因为最后对10取余,所以避免溢出,dj = cj + sum[(bi*2i/10)]mod 10.注意这个cj,代表进位,为什么要这样写呢,因为[2^i/10^j]会造成损失,2^i/10^j不会是整数,每次区整都会造成损失,那么损失到哪里去了?注意到当2^i<10^j时,这个式子实际上是加到dj-1…..d0上面去了的,所以要加上进位处理,最后的结果如下:

import math
max_1 = 3000#假设最大输入为3000位
max_2 = int(max_1/math.log(10,2))+1
weight = [0]*(max_1*max_2)
def test(s):
s = int(s,base = 2)
return str(s)
return ans
def bintodec(s,n1,n2):
sum = [0]*n2
for i in range(n1):
if(s[i]!='0'):
for j in range(n2):
sum[j] += weight[(n1-i-1)*max_2+j]
for k in range(j,n2-1):
if(sum[j]<10):break
else:
sum[j] -= 10
sum[j+1] += 1
x = ''
for each in range(n2-1,-1,-1):x+=(str(sum[each]))
print(x[1:] if x[0]=='0' else x)
print(test(s))
#预计算2^i/10^j
divisor = 1
for j in range(max_2):
for i in range(max_1):
weight[i*max_2+j] = ((1<<i)//divisor)%10
divisor *= 10
while(True):
s = input()
n1 = len(s)#64
n2 = int(n1/math.log(10,2))+1#20
if(s==''):break
bintodec(s,n1,n2)