赞
踩
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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。