二分解方程

解方程

http://www.nowcoder.com/questionTerminal/640199f70f834e1eaf39ee85b0d745c7

二分模板题
定义:
函数一个单调递增函数,那么直接二分
考虑到有可能没有解,那就用第二种二分解法,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;
}
全部评论

相关推荐

点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务