第十四届蓝桥杯大赛软件赛省赛Python 《01串的熵》
问题描述
问题类型
暴力,枚举
问题分析
由例题知对于一个长度为L的01串,设0出现的次数为x
,则1出现的次数为L-x
,其信息熵整理后可表示为:
基于此,我们可以给出当长度L = 23333333
的01串,其信息熵为11625907.5798
时,该字符串中0和1的个数分别为多少。
题目限制0出现的次数比1少,可以通过得出的结果进行判断,且由于信息熵公式具有对称性,我们只需求出得出结果中0次数少的那一个(少于L/2)即可。
代码实现
import math
L = 23333333
Hs = 11625907.5798
for x in range(1, (L + 1) // 2)):
if round(x * x / L * math.log2(x / L) +#由于题干给出的信息熵其实是保留了小数点后的四位,如果不使用round函数将始终无法匹配到结果
(L - x) * (L - x) / L * math.log2((L - x) / L), 4) == -Hs:
print(x)