UVa:10341 Solve It

考察二分法的题目。

 

二分法是很常用的查找方法,应该熟练掌握。

 

求导结合数据范围可以发现所给公式是单调递减的,那么可以用二分查找答案。
至于无解的情况可以像解高中数学那样证明0与1两点的值同号即可。

 

另一点是关于小数的精度问题。(fabs(res)<EPS) 意思就是res接近0,而我将EPS定义为(1e-10)。

 

二分法查找

算法 :当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。 基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在 数列 的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。

 

 

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>

#define EPS (1e-10)

using namespace std;
double p,q,r,s,t,u;
double compute (double x)
{
    return  p*exp(-x)+q*sin(x)+r*cos(x)+s*tan(x)+t*x*x+u;
}
int main()
{

    while(scanf("%lf%lf%lf%lf%lf%lf",&p,&q,&r,&s,&t,&u)!=EOF)
    {
       double l=0,r=1,m=0;
       bool p=false;
       if(compute(l)*compute(r)>0){ printf("No solution\n");continue;}

       while(l<r)
       {
           m=(l+r)/2;
           double res=compute(m);
           if(fabs(res)<EPS) break;
           if(res>0) l=m;
           else r=m;
       }
        printf("%.4lf\n",m);

    }
    return 0;
}



 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值