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

正常办法是直接转换成整数,然后再计算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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值