解方程式,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;
}
沒有留言:
張貼留言