很简单的数学题,涉及到精度问题,适合用二分解此题
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <math.h>
#define eps 1e-9
using namespace std;
double cal(double x)
{
return 8*x*x*x*x+7*x*x*x+2*x*x+3*x+6;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
double n;
scanf("%lf",&n);
if(cal(0)>n || cal(100)<n)
{
printf("No solution!\n");
continue;
}
double l = 0.0,r = 100.0;
double mid;
while(r-l>eps)
{
mid=(r+l)/2;
if(abs(cal(mid)-n)<=eps)
break;
else if(cal(mid)>n)
r=mid-eps;
else
l=mid+eps;
}
printf("%.4f\n",mid);
}
return 0;
}
还有一种写法
#include <iostream>
#include <cmath>
#define eps 1e-8
using namespace std;
double f(double x)
{
return 8*pow(x,4)+7*pow(x,3)+2*pow(x,2)+3*x+6;
}
int main()
{
int t;
double y;
cin>>t;
while(t--)
{
cin>>y;
if(f(0)>y||f(100)<y)
{
printf("No solution!\n");
continue;
}
double l=0.0;
double r=100.0;
double mid;
while(r-l>eps)
{
mid=(l+r)/2;
if(abs(f(mid)-y)<=eps)break;
else if(f(mid)>y)r=mid;
else l=mid;
}
printf("%.4lf\n",mid);
}
return 0;
}