UVa 10341 - Solve It

Contents

  1. 1. Problem
  2. 2. Solution
  3. 3. Code

Problem

題目網址

Solution

求 x ,本想用牛頓法,但用二分法寫完後就懶了…
方法可參考 : http://www.csie.ntnu.edu.tw/~u91029/RootFinding.html#2

而因為題目係數的限制,使得函數是個遞減函數。(詳細)

如果 $f(0) \times f(1)\gt 0$,代表他們同號,而又因為是遞減函數,所以無解。而等於零就是解了。
否則可以直接從 0~1 開始二分,直到兩者小於 EPS 。

(計算過程記得精度問題)

Code

UVa 10341
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<cstdio>
#include<cmath>
#define EPS 1e-7

int p, q, r, s, t, u;
inline double F(double x)
{
return p*exp(-x) + q*sin(x) + r*cos(x) + s*tan(x) + t*x*x + u;
}
int main()
{
while (scanf("%d%d%d%d%d%d", &p, &q, &r, &s, &t, &u) != EOF)
{
double a = 0, b = 1, mid = 0.5;
double Fmid, Fa = F(a), Fb = F(b);
if (fabs(Fa) <= EPS)
puts("0.0000");
else if (fabs(Fb) <= EPS)
puts("1.0000");
else if (Fa*Fb < 0)
{
while (b - a >= EPS)
{
Fmid = F(mid);
if (fabs(Fmid) <= EPS)
break;
else if (Fmid < 0)
b = mid;
else
a = mid;
mid = (a + b) / 2;
}

printf("%.4lf\n", mid);
}
else
puts("No solution");
}

return 0;
}