您的位置:首页 > 其它

《算法竞赛-训练指南》第二章-2.26_UVa 10341

2013-08-21 17:59 211 查看
这是一道纯解方程的题目,因为确定了范围,可以直接判断它的单调性。然后根据图像求解。

就注意这种单调性求解的题目一般都是要二分的。而因为double类型的一些缺点,并不想我们现实中那样。比如1就是1,在double型里面1可能是0.999999999999。注意这些就行了。另外就是二分的时候R-L尽量的小一些吧,因为越小答案就越精确。这个不一定就是保留到4位,你就1e-5就行,这是不一定的,稍微小一点时间上不会差太多,但是不这样答案就有可能错!切记。

贴出代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <string>

using namespace std;

const double eps = 1e-14;

double p, q, r, s, t, u;

double F(double x)
{
return p * exp(-x) + q * sin(x) + r * cos(x) + s * tan(x) + t * x * x + u;
}

int main()
{
// printf("%lf", 1e-5);
while (scanf("%lf%lf%lf%lf%lf%lf", &p, &q, &r, &s, &t, &u) != EOF)
{
double ans0 = F(0.0);
if (ans0 < 0)
{
printf("No solution\n");
continue;
}
double ans1 = F(1.0);
if (ans1 > 0)
{
printf("No solution\n");
continue;
}
double L = 0.0;
double R = 1.0;
while (R - L > 1e-7) //这里为什么要达到1e-7方就不得而知了!看来书上讲的到1e-5不靠谱啊、
{
double mid = L + (R - L) / 2;
if (F(mid) < 0)
{
R = mid;
}
else
{
L = mid;
}
}
printf("%.4lf\n", L);
}
// system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: