题意:方程 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; }