uva 10341 - Solve It

点击打开链接uva 10341


题目意思:     给定一个函数的表达式,然后给定系数值,要我们求出未知数x


解题思路:    1:由函数的性质可知,如果有解,那么将区间两个点带入求出的数值的乘积为负数。首先先判断这个函数是否有解,如果无解直接返回输出,有解进行二分查找
                      2:二分查找时候由于0= f(1) 可以知道,所以这里很平常的有些不同。
                      3:注意迭代二分的使用,注意double类型的比较


代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std

double p , q , r , s , t , u;

void solve(){
    double left , right , mid  , tmp;
    double s1 , s2;
    s1 = p*(exp(0))+q*sin(0)+r*cos(0)+s*tan(0)+t*0+u;
    s2 = p*(exp(-1))+q*sin(1)+r*cos(1)+s*tan(1)+t*1+u;
    
    if(s1*s2 > 0) printf("No solution\n");
    else{
        left = 0.0 ; right = 1.00;
        while(right-left > 1e-9){//注意判断条件
            mid = (left +right)/2;//中间值
            tmp = p*(exp(-mid))+q*sin(mid)+r*cos(mid)+s*tan(mid)+t*mid*mid+u;//求出函数值
            if(tmp < 0) right = mid;//小于0则要向左边二分
            else  left = mid;//否则右边二分
        }  
        printf("%.4lf\n" , mid);//输出的mid就是x值
    }
}

int main(){
    //freopen("input.txt" , "r" , stdin);
    while(scanf("%lf%lf%lf%lf%lf%lf" , &p,&q,&r,&s,&t,&u) != EOF)
        solve();
    return 0;
}


你可能感兴趣的:(ACM,----基础题,ACM,----基础题)