当前位置:   article > 正文

蓝桥杯DAY3-2.28_01串的熵题目是什么意思

01串的熵题目是什么意思


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,也就是把信息熵的公式简化成好用代码表示的样子。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int N = 23333333;
  4. double ans = 11625907.5798;
  5. double eps=1e-4; //eps:误差
  6. int main(){
  7. for(int v=0;v<=N/2;v++){ //v是0的个数,0比1少
  8. int u=N-v; //u是1的个数,v是0的个数
  9. double res=-1.0*u*u/N*log2(1.0*u/N)-1.0*v*v/N*log2(1.0*v/N);
  10. if(fabs(res-ans)<eps){ //res和ans相减小于误差,认为相等
  11. cout<<v; //找到了v
  12. break;
  13. }
  14. }
  15. return 0;
  16. }

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` 值,并结束程序。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/438837
推荐阅读
相关标签
  

闽ICP备14008679号