题目链接:
2.01串的熵 - 蓝桥云课 (lanqiao.cn)
注意点:
1.C++的log函数:有2,e(log()以e为底),10为底的,没有现成的用换底公式:
C++ 标准库 <cmath> 数学函数大全 - 菜鸟教程 (cainiaojc.com)
2.浮点数相等比较,用差值绝对值小于某个很小的值。以用fabs 求浮点数绝对值 。abs返回整形。
代码:
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
double res= 11625907.5798;
int s=23333333ll;
bool calcu(int a,int b){
double ans=0;
double rate0=a*1.0/s,rate1=b*1.0/s;
//log的换底公式,换成自定义底数,log函数以e为底
//c++有现成的以2为底的函数 log2()
// ans+=-(rate0*a*log(rate0)/log(2));
// ans+=-(rate1*b*log(rate1)/log(2));
ans+=-(rate0*a*log2(rate0));
ans+=-(rate1*b*log2(rate1));
//注意浮点数的比较,题目保留的四位,那么差值误差在三位就可以了
//可以用fabs 求浮点数绝对值
// if(ans-res<1e-3&&ans-res>0) return true;
// if(res-ans<1e-3&ans-res<0) return true;
//res= 11625907.5798,那么res>=11625907.57975 ,差值肯定小于0.0001
if(fabs(ans-res)<1e-4) return true;
return false;
}
//直接暴力枚举所有0小于1的情况,注意算出结果之后再带进去算一下验证。
//注意换底公式,注意读题仔细一点看一下它的公式是怎么样的,每一项带入的是比例,
//0和1的式子是分别相同的,所以可以直接个数乘式子即可
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
//验证
// calcu(2,1);
//calcu(11027421,s-11027421);
int fre0=1,fre1=s-1;
for(;fre0<fre1;fre0++,fre1--){
if(calcu(fre0,fre1))
break;
}
if(fre0<fre1)
cout<<fre0;
// cout<<log2(2);
// cout<<11027421ll;
return 0;
}