目录
1、凑数法逻辑:
二进制转十进制是每一位1乘相应的2^(n-1)再累加起来,所以会出现每一项都等于此项前所有项的和的性质,因此十进制转二进制时要先找到不超过目标的最大的项,随后依次往下尝试。
若加上下一项大于目标,那就跳过下一项;若加上下一项小于目标,那就加上下一项再向下进行(若此时不加上下一项,即使剩下的所有项加起来也一定小于目标)。由于项每次减半,所以会有种二分法的意思。
2、代码实现:
整数部分(部分):
for k in range (index-1,-1,-1):
if (sum+binary[k])==desti: #如果加上下一位刚刚好就得到结果,退出循环
final.append(k)
break
elif (sum+binary[k])>desti: #如果加上下一位大了,就继续往下一位找
continue
elif (sum+binary[k])<desti: #如果加上下一位小了,也要继续往下一位找
sum += binary[k]
final.append(k)
continue
desti = 0
for n in final:
desti += 10**n #final列表里存放的是结果中1的位数
print("结果是:%d"%desti)
小数部分(部分):
for k in range(100):
if (round((sum + binary[k]), 10)) == (round(desti, 10)):
#十位小数四舍五入,不然可能会有精度问题
final.append(k)
break
elif (sum + binary[k]) > desti:
continue
elif (sum + binary[k]) < desti:
sum += binary[k]
final.append(k)
continue
desti = 0
for n in final:
desti += 10 ** (-(n + 1))