uva 10341 Solve It

来源:互联网 发布:c#开发书籍推荐 知乎 编辑:程序博客网 时间:2024/05/05 03:54

二分法,注意端点精度0.00001是过不了的……1e-9差不多吧……

#include<stdio.h>#include<math.h>double a1,a2,p,q,r,s,t,u;double f(double x){    double ans=p*exp(-x)+q*sin(x)+r*cos(x)+s*tan(x)+t*x*x+u;    return ans;}int main(){    double ans;    while(~scanf("%lf%lf%lf%lf%lf%lf",&p,&q,&r,&s,&t,&u))    {        a1=0;a2=1;        if(f(0)<0&&f(1)<0) printf("No solution\n");        else if(f(0)>0&&f(1)>0) printf("No solution\n");        else        {            while(a2-a1>=0.000000001)            {                ans=(a2-a1)/2;                if(f(ans+a1)>0)                {                    if(f(a1)<0) a2=ans+a1;                    else a1=ans+a1;                }                else                {                    if(f(a1)<0) a1=ans+a1;                    else a2=ans+a1;                }            }            printf("%.4f\n",a1);        }    }    return 0;}

简化版

#include<stdio.h>#include<math.h>double p,q,r,s,t,u;double f(double x){    double ans=p*exp(-x)+q*sin(x)+r*cos(x)+s*tan(x)+t*x*x+u;    return ans;}int main(){    double a1,a2,ans,k;    while(~scanf("%lf%lf%lf%lf%lf%lf",&p,&q,&r,&s,&t,&u))    {        a1=0;a2=1;        if(f(0)*f(1)>0) printf("No solution\n");        else        {            while(a2-a1>0.000000001)            {                ans=a1+(a2-a1)/2;                k=f(ans);                if(k<0) a2=ans;                else a1=ans;            }            printf("%.4lf\n",a1);        }    }    return 0;}


0 0
原创粉丝点击