题意:方程 8* X ^ 4 + 7 * X ^ 3 + 2 * X ^ 2 + 3 * X + 6 == Y,x取值在0和100之间,现在给你一个Y 让你求x的值
思路:二分,因为方程为单调递增序列,所以先将50( mid = (0+100) / 2 )带入方程得到Y1值,比较Y和Y1的大小,
如果Y1 < Y 说明x的取值小了 ,然后解得区间 就变成left = mid [mid , right]
如果Y1 > Y 说明x的取值大了,然后解得区间就变成 right = mid [left , mid]
继续查找至循环结束,mid就是解
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double eps = 1e-8;//精度
double f(double x)
{
return 8*pow(x,4)+7*pow(x,3)+2*pow(x,2)+3*x;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int Y,flag = 0;
scanf("%d",&Y);
double left = 0,right = 100.0,mid;
if(Y - 6 < 0)
{
printf("No solution!\n");continue;
}
if(f(0) <= Y && Y <= f(100))
{
while((right - left) > eps)// (left - right) < eps 这样和下面会出现矛盾,当left 等于right 时0 < eps 会进入死循环,所以反过来写
{
mid = (left + right) / 2.0;
double sum = f(mid);
if(sum > Y-6)
{
right = mid;
}
else if(sum < Y-6)
{
left = mid;
}
}
printf("%.4lf\n",mid);continue;
}
printf("No solution!\n");
}
return 0;
}