赞
踩
这是一个模拟题,就直接用代码表示求就可以。
已知长度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;
- }
在这段代码中,`if(fabs(res-ans)<eps)` 这一行的作用是判断计算结果 `res` 和给定答案 `ans` 之间的差值是否小于指定的误差范围 `eps`。
使用 `fabs()` 函数可以计算两个数的绝对值之差,即不考虑正负号的差异。如果这个差值小于误差范围 `eps`,则认为 `res` 和 `ans` 相等。
这种比较方法通常用于处理浮点数的精度问题。由于计算机在表示浮点数时存在一定的误差,直接比较两个浮点数是否相等可能会得到不准确的结果。通过设置一个较小的误差范围 `eps`,我们可以容忍一定的误差,只要两个数的差值小于这个范围,就认为它们相等。
在这个例子中,我们的目标是找到一个满足条件的解,即计算结果 `res` 和给定答案 `ans` 之间的差值小于误差范围 `eps`。一旦找到这样的解,就可以输出对应的 `v` 值,并结束程序。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。