正常办法是直接转换成整数,然后再计算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) deftest(s): s = int(s,base = 2) return str(s) return ans defbintodec(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)