2015年10月4日 星期日

[UVA] 10341 - Solve It

題意:
解方程式,0 <= 根 <= 1。
輸出根,小數點後四位。

--------------------------------------------------

我的作法:
利用二分搜尋,
lower=0,upper=1,
用middle去帶入方程式,

因為有解的話,根只有一個,
所以:
f(lower)和f(upper)同號,表示無解,
f(middle)*f(lower)<0表示根在middle左邊,
f(middle)*f(upper)<0表示根在middle右邊!

--------------------------------------------------

/* 20151004
 * hanting
 * UVa 10341 - Solve It
 * C++
 */
#include <iostream>
#include <cmath> //sin,cos,tan,exp,pow
#include <iomanip> //setprecision
using namespace std;
#define e exp(1)
#define MID(x,y) x+(y-x)/2
int p,q,r,s,t,u;
inline double f(double x)
{
    return p*pow(e,-x)+q*sin(x)+r*cos(x)+s*tan(x)+t*pow(x,2.)+u;
}
void solution()
{
    double low=0,up=1,mid=MID(low,up);
    bool NoSolution=false;
    double ans=0;
    while(low<up)
    {
        double fx=f(mid),flow=f(low),fup=f(up);
        if(abs(fx)<1e-6)
        {
            ans=mid;
            break;
        }
        else if(abs(flow)<1e-6)//判斷根是否在下界
        {
            ans=low;
            break;
        }
        else if(abs(fup)<1e-6)//判斷根是否在上界
        {
            ans=up;
            break;
        }
        if(flow*fup>0)
        {
            NoSolution=true;
            break;
        }
        if(fx*flow<=0)
        {
            up=mid;
            mid=MID(low,up);
        }
        else if(fx*fup<0)
        {
            low=mid;
            mid=MID(low,up);
        }
    }
    if(NoSolution)
        cout<<"No solution"<<endl;
    else
        cout<<fixed<<setprecision(4)<<ans<<endl;
}
int main()
{
    while(cin>>p>>q>>r>>s>>t>>u)
    {
        solution();
    }
    return 0;
}

沒有留言:

張貼留言