前言
NWAFU P1546
一、题目描述
题目描述
输入由字符集{'a', 'b', 'c'}中的字符构成的不定长度(长度>=1)的多个字符序列,利用下式计算其信息熵H:
式中,pi表示字符集{'a','b','c'}中第i(i=1,2,3)个字符在字符序列中出现的频率(即该字符出现的次数除以序列有效总长度,其中有效总长度是指在序列中出现的'a'、'b'、'c'字符的个数),log2表示以2为底的对数,可通过math.h中的log2函数计算(在117服务器上编译时需加-lm参数)。注意:若序列中出现{'a', 'b', 'c'}之外的字符,如其他字母、数字及空格、制表符等其他符号,则不计入统计。
输入
由{'a', 'b', 'c'}三个字符构成的不定长度(且长度>=1)的字符序列,以回车键作为结束
输出
在屏幕上打印所输入字符序列的信息熵H值,并保留小数点后3位有效数字
样例输入
aacc
样例输出
1.000
二、设计步骤
一道纯公式题,但是居然很少人做对!
频率可以用数组和计数器实现,需要注意的是停止条件和log2函数的使用
代码实现:
#include<stdio.h>
#include<math.h>
#define _CRT_SECURE_NO_WORNINGS 1
int main(void)
{
char ch;
int i,sum = 0;
float count[3] = {0},H[3] = {0.0},p[3] = {0.0};
float ret = 0;
ch = getchar();
while(ch != '\n'){
if(ch == 'a'){
count[0]++;
sum++;
}
else if(ch == 'b'){
count[1]++;
sum++;
}
else if(ch == 'c'){
count[2]++;
sum++;
}
ch = getchar();
}
for(i = 0;i < 3;i++){
p[i] = count[i]/sum;
if(p[i]!= 0)
H[i] = p[i] * log2(p[i]);
else
H[i] = 0;
ret += H[i];
}
ret = -ret;
printf("%.3f\n",ret);
return 0;
}
总结
EOF