相关知识
字符串中字符的编号和二进制的数位是不一样的,但两者之间有对应关系,找出这种对应关系是解决该问题的关键。
参数b
可能包含小数点,也可能不包含小数点,可以在函数体开始时进行判断,若b
不包含小数点,则在b
的最后添加一个小数点,从而后面可以统一处理。
本关可能会用到字符串的相关操作,可以参考“除二取余”实训第 1 关。
编程要求
在 Begin-End 区间实现BinToDec(b)
函数,其功能是将二进制数b
转换为十进制,说明如下:
1)b
是一个用字符串表示的二进制数;
2)在测试集中,b
均为正数(如果你的程序还能处理其它情况则更好);
3)b
可能包含小数点(表示二进制小数,如110101.111
),也可能不包含小数点(表示二进制整数,如11010
);
4)不准使用 Python 提供的进制转换函数。
########## Begin ##########
def BinToDec(b):
b=str(b)
l=[]
if '.'not in b:
b=b[::-1]
for i in range(len(b)):
l.append(int(b[i])*2**i)
return sum(l)
else:
location=b.index('.')
b1=b[:location]
b1=b1[::-1]
b2=b[location+1:]
for i in range(len(b1)):
l.append(int(b1[i])*2**i)
for i in range(len(b2)):
l.append(int(b2[i])*2**(-1-i))
return sum(l)
########## End ##########
b = input()
d = BinToDec(b)
print('%s -> %s' % (b, d))
########## Begin ##########
def BinToDec(b):
b=str(b) #将b转换为字符
l=[] #创建一个空列表
if '.'not in b: #如果为整数
b=b[::-1] #将b中的顺序颠倒
for i in range(len(b)): #从字符串i
l.append(int(b[i])*2**i) #字符串b中,第i个字符乘以2的i次方
return sum(l)
else: #浮点,有小数点的情况
location=b.index('.') #定位小数点的位置
b1=b[:location] #小数点前的数,即整数
b1=b1[::-1] #将b1字符串中字符的顺序颠倒,向后转
b2=b[location+1:] #b2为小数点后面一位
for i in range(len(b1)):
l.append(int(b1[i])*2**i) #计算整数部分
for i in range(len(b2)):
l.append(int(b2[i])*2**(-1-i)) #计算小数点后面的部分
return sum(l) #将两部分相加,拼接
########## End ##########
b = input()
d = BinToDec(b)
print('%s -> %s' % (b, d))
########## Begin ##########
def BinToDec(b):
if '.' not in b: #若b不包含小数点
b = b+'.' #则在最后添加小数点
n = b.index('.') #小数点的编号,即整数部分的总位数
b = b.replace('.','') #删除小数点,方便后面的运算
d = 0
for i in range(len(b)): #对于二进制每一位
if b[i]=='1': #若这一位为1,则将对应的位权累加到d
d=d+2**(n-1-i) #字符串第i号字符对应二进制的第n-1-i位
return d
########## End ##########
b = input()
d = BinToDec(b)
print('%s -> %s' % (b, d))