计算信息熵

前言

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值