24h購物| | PChome| 登入
2012-05-05 20:43:13| 人氣1,036| 回應0 | 上一篇 | 下一篇

[UVA][牛頓法] 10341 - Solve It

推薦 0 收藏 0 轉貼0 訂閱站台

Problem F

Solve It

Input: standard input

Output: standard output

Time Limit: 1 second

Memory Limit: 32 MB

Solve the equation:
        p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0
        where 0 <= x <= 1.

Input

Input consists of multiple test cases and terminated by an EOF. Each test case consists of 6 integers in a single line: p, q, r, s, t and u (where 0 <= p,r <= 20 and -20 <= q,s,t <= 0). There will be maximum 2100 lines in the input file.

Output

For each set of input, there should be a line containing the value of x, correct upto 4 decimal places, or the string "No solution", whichever is applicable.

Sample Input

0 0 0 0 -2 1
1 0 0 0 -1 2
1 -1 1 -1 -1 1

Sample Output

0.7071
No solution
0.7554

為了一個牛頓法, 吃了好多 WA


#include <stdio.h>
#include <math.h>
#define eps 1e-6

int p, q, r, s, t, u;
double calc1(double xn) {
return p*exp(-xn) + q*sin(xn) + r*cos(xn) + s*tan(xn) + t*xn*xn + u;
}
double calc2(double xn) {
return -p*exp(-xn) + q*cos(xn) - r*sin(xn) + s/cos(xn)/cos(xn) + t*2*xn;
}
int main() {
while(scanf("%d %d %d %d %d %d", &p, &q, &r, &s, &t, &u) == 6) {
if(calc1(1)*calc1(0) > 0) {
puts("No solution");
continue;
}
if(fabs(calc1(0)) < eps) {
puts("0.0000");
continue;
}
if(fabs(calc1(1)) < eps) {
puts("1.0000");
continue;
}
double xn = 1, fx;
while(1) {
fx = calc1(xn);
if(fabs(fx) < eps) {
break;
}
xn = xn - fx/calc2(xn);
}
printf("%.4lf\n", xn);
}
return 0;
}

台長: Morris
人氣(1,036) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: UVA |
此分類下一篇:[UVA][Math] 12024 - Hats
此分類上一篇:[UVA][二分] 10341 - Solve It

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文