所给函数关系式中自变量x大于零,又都是加法运算,所以明显是递增的。故可用二分法求近似解,精度很重要。。
方法一:
#include<cstdio>
#include<cmath>
double F(double x){
return 8*pow(x,4)+7*pow(x,3)+2*x*x+3*x+6;
}//定义关系函数
int main(){
int t;
scanf("%d",&t);
while(t--){
double y;
scanf("%lf",&y);
if(F(0)>y||F(100)<y){//不在值域内时
printf("No solution!\n");
continue;
}
double l=0.0,r=100.0,mid=(l+r)/2;
while(r-l>1e-6){
if(F(mid)<y)
l=mid+1e-6;//加上精度
else
r=mid-1e-6;
mid=(l+r)/2;
}
printf("%.4lf\n",mid);
}//当y=100时输出结果为1.6151,但是能AC!
return 0;
}
方法二:
#include<cstdio>
#include<cmath>
double F(double x){
return 8*pow(x,4)+7*pow(x,3)+2*x*x+3*x+6;
}//定义关系函数
int main(){
int t;
scanf("%d",&t);
while(t--){
double y;
scanf("%lf",&y);
if(F(0)>y||F(100)<y){//y不在值域内时
printf("No solution!\n");
continue;
}
double l=0.0,r=100.0,mid=(l+r)/2;
while(fabs(F(mid)-y)>1e-5){//当F(mid)于y相差小于1e-5时结束
if(F(mid)<y)
l=mid+1;//加减1!
else
r=mid-1;
mid=(l+r)/2;
}
printf("%.4lf\n",mid);
}
return 0;
}