nHDOJ-2199
给出方程:
8*x4 + 7*x3 + 2*x2 + 3*x + 6 = Y
其中,实数Y满足 (fabs(Y) <= 1e10)
请输出x在区间[0,100]的解,结果精确到小数点后4位。
常规暴力枚举?
当测试数据足够多->效率低下
指定区间内的单调性(如何证明?),利用求导>0递增,<0递减
推荐方法:二分求解
浮点数x的绝对值
e10表示的是10的十次方
fabs(Y) <= 1e10 意思:1*10^10
- #include <iostream>
- #include <cmath>
- using namespace std;
- double Y;
- double low, high, mid;
- double f( double x )
- {
- return 8*pow(x, 4.0) + 7*pow(x, 3.0) + 2*pow(x, 2.0) + 3*x + 6;
- }
- int main()
- {
- int T;
- scanf("%d", &T);
- while(T--)
- {
- scanf("%lf", &Y);
- if( f(0) <= Y && Y <= f(100) )
- {
- low = 0;
- high = 100;
- while( high - low > 1e-6 ) //low 与high不要求相等,所以后面的移动不要求判断相等
- {
- mid = (low + high) / 2;
- double ans = f(mid);
- if(ans>Y)
- {
- high = mid - 1e-7;
- }
- else
- low = mid + 1e-7;
- }
- printf("%.4lf\n", (low + high) / 2 );
- }
- else
- printf("No solution!\n");
- }
- return 0;
- }
阅读(916) | 评论(0) | 转发(0) |