当前位置:   article > 正文

第14届蓝桥杯C++B组省赛:串的熵|枚举、浮点数相等比较、log函数_蓝桥杯串的熵

蓝桥杯串的熵

题目链接:

 2.01串的熵 - 蓝桥云课 (lanqiao.cn)

注意点:

1.C++的log函数:有2,e(log()以e为底),10为底的,没有现成的用换底公式:

\log_{m}n=\log_{e}n /\log_{e}m

C++ 标准库 <cmath> 数学函数大全 - 菜鸟教程 (cainiaojc.com)

 2.浮点数相等比较,用差值绝对值小于某个很小的值。以用fabs 求浮点数绝对值 。abs返回整形。

代码:

 

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define endl '\n'
  4. using namespace std;
  5. double res= 11625907.5798;
  6. int s=23333333ll;
  7. bool calcu(int a,int b){
  8. double ans=0;
  9. double rate0=a*1.0/s,rate1=b*1.0/s;
  10. //log的换底公式,换成自定义底数,log函数以e为底
  11. //c++有现成的以2为底的函数 log2()
  12. // ans+=-(rate0*a*log(rate0)/log(2));
  13. // ans+=-(rate1*b*log(rate1)/log(2));
  14. ans+=-(rate0*a*log2(rate0));
  15. ans+=-(rate1*b*log2(rate1));
  16. //注意浮点数的比较,题目保留的四位,那么差值误差在三位就可以了
  17. //可以用fabs 求浮点数绝对值
  18. // if(ans-res<1e-3&&ans-res>0) return true;
  19. // if(res-ans<1e-3&ans-res<0) return true;
  20. //res= 11625907.5798,那么res>=11625907.57975 ,差值肯定小于0.0001
  21. if(fabs(ans-res)<1e-4) return true;
  22. return false;
  23. }
  24. //直接暴力枚举所有0小于1的情况,注意算出结果之后再带进去算一下验证。
  25. //注意换底公式,注意读题仔细一点看一下它的公式是怎么样的,每一项带入的是比例,
  26. //01的式子是分别相同的,所以可以直接个数乘式子即可
  27. signed main(){
  28. ios::sync_with_stdio(0);
  29. cin.tie(0);cout.tie(0);
  30. //验证
  31. // calcu(2,1);
  32. //calcu(11027421,s-11027421);
  33. int fre0=1,fre1=s-1;
  34. for(;fre0<fre1;fre0++,fre1--){
  35. if(calcu(fre0,fre1))
  36. break;
  37. }
  38. if(fre0<fre1)
  39. cout<<fre0;
  40. // cout<<log2(2);
  41. // cout<<11027421ll;
  42. return 0;
  43. }

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

闽ICP备14008679号