二分模板题
定义:
函数一个单调递增函数,那么直接二分
考虑到有可能没有解,那就用第二种二分解法,for循环
二分左区间为l,右区间为r
然后当时,太小了,l = mid
否则太大了,r = mid
此处针对特别毒瘤的数据,加入几何的double处理
#include <iostream>
#include <cstdio>
#include <cmath>
#define ll long long
using namespace std;
const double eps = 1e-7;
double a, b, c;
int sgn(double d){//符号判断
if(fabs(d) < eps)return 0;//0
if(d > 0)return 1;//正数
return -1;//负数
}
int dcmp(double x, double y){//数据比较
if(fabs(x - y) < eps)return 0;//相等
if(x > y)return 1;//x大
return -1;//y大
}
double cal(double x){
return pow(x, a) + b * log(x) - c;
}
int main(){
cin >> a >> b >> c;
double l = 0, r = c, mid;
for(int i = 1; i <= 100; i++){
mid = (l + r) / 2;
if(dcmp(cal(mid), 0) == 0)break;
if(dcmp(cal(mid), 0) == -1)l = mid;
else r = mid;
}
if(dcmp(cal(mid), 0) == 0)
printf("%.14lf\n", mid);
else printf("-1\n");
return 0;
}


京公网安备 11010502036488号