題目連結
題目大意:
給一方程式F(x)=0, input為參數,解x,或無解。
解題思路
function是一個遞減函數,所以如果F(0) < -eps, F(1)>eps,函數就不會和 0<x<1 有交集。
剩下的用binary search,因為是浮點數,要求lower_bound=upper_bound,會跑入無窮迴圈,只要相減在一個誤差內即可。
Code
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
| #include <cstdio>#include <cmath>#define F(x) (p*exp(-x)+q*sin(x)+r*cos(x)+s*tan(x)+t*x*x+u)int main(){ int p,q,r,s,t,u; double lower_bound, upper_bound,mid,fofx; lower_bound = 0.0; upper_bound = 1.0; while(scanf("%d %d %d %d %d %d",&p,&q,&r,&s,&t,&u)!=EOF){ if (F(0)<-(1e-14) || F(1)>1e-14) { printf("No solution\n"); } else { lower_bound = 0.0; upper_bound = 1.0; while((upper_bound-lower_bound)>=1e-9){ mid = (upper_bound+lower_bound)/2; fofx = F(mid); if(fofx>0) lower_bound = mid; else upper_bound = mid; } printf("%.4lf\n",upper_bound); } } return 0;} |
幾個技巧
1. 函數可以用define再代入x
2. 用binary search 找x較省時
3. 輸出精度4位:%4lf