Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2857279
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-08-06 10:08:13

 
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
 

点击(此处)折叠或打开

  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;

  4. double Y;
  5. double low, high, mid;

  6. double f( double x )
  7. {
  8.     return 8*pow(x, 4.0) + 7*pow(x, 3.0) + 2*pow(x, 2.0) + 3*x + 6;
  9. }
  10. int main()
  11. {
  12.     int T;
  13.     scanf("%d", &T);
  14.     while(T--)
  15.     {
  16.         scanf("%lf", &Y);

  17.         if( f(0) <= Y && Y <= f(100) )
  18.         {
  19.             low = 0;
  20.             high = 100;
  21.             while( high - low > 1e-6 ) //low 与high不要求相等,所以后面的移动不要求判断相等
  22.             {
  23.                 mid = (low + high) / 2;
  24.                 double ans = f(mid);
  25.                 if(ans>Y)
  26.                 {
  27.                     high = mid - 1e-7;
  28.                 }
  29.                 else
  30.                     low = mid + 1e-7;
  31.             }
  32.             printf("%.4lf\n", (low + high) / 2 );
  33.         }
  34.         else
  35.             printf("No solution!\n");
  36.     }
  37.     return 0;
  38. }

阅读(916) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~