hdu2199(方程求值二分法)

来源:互联网 发布:众海消防主机编程密码 编辑:程序博客网 时间:2024/06/06 01:07

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


原创粉丝点击