第十四届蓝桥杯省赛B组c++——填空题201串的熵
问题描述
对于一个长度为 nn 的 01 串 S=x1x2x3…xnS=x1x2x3…xn,香农信息熵的定义为 H(S)=H(S)= −Σ1np(xi)log2(p(xi))−Σ1np(xi)log2(p(xi)),其中 p(0),p(1)p(0),p(1) 表示在这个 01 串中 0 和 1 出现的占比。
比如,对于 S=100S=100 来说,信息熵 H(S)=−13log2(13)−23log2(23)−23log2(23)=1.3083H(S)=−31log2(31)−32log2(32)−32log2(32)=1.3083。
对于一个长度为 2333333323333333 的 01 串, 如果其信息熵为 11625907.579811625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次?
答案提交
这是一道结果填空的题, 你只需要算出结果后提交即可。本题的结果为一 个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。
#include<iostream>
#include<iomanip>
//log2(4)
//保留小数位但是不打印,本题用了相减检验是否小于0.0001
using namespace std;
int main() {
for (int i = 1; i <= 11666666; i++) {
double x = -(double)i / 23333333.0 * log2((double)i / 23333333.0);
double y = -(double)(23333333-i) / 23333333.0 * log2((double)(23333333 - i) / 23333333.0);
double ans = x * i + y * (23333333 - i);
/*cout<<fixed << setprecision(4) << ans;*/
if (abs(ans- 11625907.5798)<0.0001) {
cout << "找到了" << i <<" "<<ans<< endl;
}
}
return 0;
}
log:表示对数,与指数相反。log₈2我们读作log以8为底,2的对数。具体计算方式是2的3次方为8,及以8为底2的对数就是3。
lg:10为底的对数,叫作常用对数。
ln:以无理数e(e=2.71828...)为底的对数,叫作自然对数
在c++中:
头文件#include<cmath>
log2(4):以2为底的4
log(4):以e为底的4
科学记数法规则
-
格式:
±A.BCDe±N
其中:-
A.BCD
是有效数字部分(1 ≤ A < 10)。 -
e±N
表示乘以10的N次方。
-
-
示例:
+1.16259e+07
-
有效数字:
1.16259
-
指数:
+07
(即10的7次方) -
计算:
1.16259×107=1.16259×10,000,000=11,625,900
-