问题描述

算法思想
首先分析题目中给出的公式
S = 100时,其信息熵为
H(S)=−p(0)log2(p(0)) − p(0)log2(p(0)) − p(1)log2(p(1))
继续化简公式得
设0出现的次数为x,1出现的次数为3-x
H(S)=−x * p(0) * log2(p(0)) − (3-x) * p(1) * log2(p(1))
现在,我们有一个长度为23333333的01串,其信息熵已知为11625907.5798。题目还告诉我们,0出现的次数比1少。我们的任务是计算出0出现的次数。
为了解决这个问题,我们只需暴力枚举01串,计算出相应的信息熵和已知条件对比,由于0出现的次数比1少,我们只需遍历到数组的一半位置即可
参考代码
cs
#include<stdio.h>
#include<math.h>
int main(int argc,char *argv[])
{
double n = 23333333;
double zeroSum = 0;
int zero,one;
for(zero = 0; zero <= n / 2;++zero)
{
one = n - zero;
zeroSum = -zero * (zero / n) * log2(zero / n) - one * (one / n) * log2(one / n);
if(zeroSum > 11625907.5 && zeroSum < 11625907.6)
{
printf("%d",zero);
break;
}
}
return 0;
}
答案:
