题目:信息熵的计算
问题描述
假设
X
表示离散信源,其可能的取值为
{𝑥
1
, 𝑥
2
, … , 𝑥
𝑛
}
,每个取值发生的概率分别为
{𝑝
1
, 𝑝
2
, … , 𝑝
𝑛
}
,即
X
的值为
𝑥
1
发生的概率为
𝑝
1
,
X
的值为
𝑥
2
发生的概率为
𝑝
2
,依此类推。
𝑝
1
, 𝑝
2
, … , 𝑝
𝑛
之和为
1
。信源
X
的信源熵定义为:
𝐻(𝑋) = ∑
𝑝(𝑥
𝑖
) log
2
𝑝( 1 𝑥
𝑖
)
𝑛
𝑖=1
要求写程序实现:可以输入任意的信源数量(即
n
的个数不确定),以及对应数量的每个取
值发生的概率,并求得该信源的信息熵。
输入格式
输入的第一行包含一个整数
n
,表示信源
X
的数量。
输入的第二行包含
n
个浮点数
𝑝
1
, 𝑝
2
, … , 𝑝
𝑛
,表示信源
X
的
n
个取值所发生的概率,相邻的
浮点数之间用一个空格分隔。
输出格式
当
𝑝
1
, 𝑝
2
, … , 𝑝
𝑛
之和不为
1
时,输出“
Error Input
!”;
否则输出一个浮点数(保留小数点后四位小数,四舍五入),表示该信源的信息熵。
样例输入
2
0.01 0.99
样例输出
0.0808
样例说明
2
为信源
X
的数量,即
X
有
2
种可能取值。每个取值的概率分别为
0.01,0.99
。
评测用例规模与约定
1
≤
n
≤
1000
,
0 <
𝑝
𝑖
≤
1
。
#include<stdio.h>
#include<math.h>
int main() {
int n;
float d;
scanf("%d",&n);
float sum=0,h=0;
for(int i=0;i<n;i++) {
scanf("%f",&d);
sum+=d;
if(d!=1&&d!=0)
h=h-d*log2(d);
}
if(sum!=1)
printf("Error Input!");
else
printf("%.4f",h);
}
我记得这个一直过不了,但不清楚哪里有问题,有空去看看,大家参考参考就行。