蓝桥杯DAY3-2.28

文章讲述了如何用C++编程解决一个关于01串信息熵的问题,通过计算1和0的频率并应用信息熵公式,同时处理浮点数精度问题,确保计算结果与给定答案的误差在可接受范围内。
摘要由CSDN通过智能技术生成


1.01串的熵

这是一个模拟题,就直接用代码表示求就可以。

已知长度n与信息熵,且0出现的次数比1少。

问:这个串种0出现了多少次?

总长度是n,设u是1的个数,v是0的个数,则  n=u+v;

现在求v,只要n-u即可。

【蓝桥杯】初学者试讲2023年C/C++B组试题B:01串的熵_哔哩哔哩_bilibili

题目中的H(S)中有一个1,两个0,其实两个零的计算可以合并,-2/3再-2/3相当于-2*2/3,也就是把信息熵的公式简化成好用代码表示的样子。

#include<bits/stdc++.h>
using namespace std;

int N = 23333333;
double ans = 11625907.5798;
double eps=1e-4;      //eps:误差
int main(){
    for(int v=0;v<=N/2;v++){ //v是0的个数,0比1少
        int u=N-v;           //u是1的个数,v是0的个数
        double res=-1.0*u*u/N*log2(1.0*u/N)-1.0*v*v/N*log2(1.0*v/N);
        if(fabs(res-ans)<eps){  //res和ans相减小于误差,认为相等
            cout<<v;      //找到了v
            break;
        }
    }
    return 0;
}

1.为什么要写if(fabs(res-ans)<eps){ //res和ans相减小于误差,认为相等

在这段代码中,`if(fabs(res-ans)<eps)` 这一行的作用是判断计算结果 `res` 和给定答案 `ans` 之间的差值是否小于指定的误差范围 `eps`。

使用 `fabs()` 函数可以计算两个数的绝对值之差,即不考虑正负号的差异如果这个差值小于误差范围 `eps`,则认为 `res` 和 `ans` 相等。

这种比较方法通常用于处理浮点数的精度问题。由于计算机在表示浮点数时存在一定的误差,直接比较两个浮点数是否相等可能会得到不准确的结果。通过设置一个较小的误差范围 `eps`,我们可以容忍一定的误差,只要两个数的差值小于这个范围,就认为它们相等。

在这个例子中,我们的目标是找到一个满足条件的解,即计算结果 `res` 和给定答案 `ans` 之间的差值小于误差范围 `eps`。一旦找到这样的解,就可以输出对应的 `v` 值,并结束程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值