Solve It(二分+精度求解方程值)

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= 0where0 <=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,tandu(where0 <=p,r<= 20and-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 ofx, correct upto 4 decimal places, or the string "No solution", whichever is applicable.

Sample Input0 0 0 0 -2 11 0 0 0 -1 21 -1 1 -1 -1 1Sample Output0.7071No solution0.7554

题意:给出p,q,r,s,t,u的值,根据方程式求出方程的近似解。

思路:因为方程是递减的,对于两个端点,如果f(0)<0或者是f(1)>0 ,则说明方程无解。取两个端点的中点mid 如果f(0)*f(mid)<0 ,说明方程的解在[0,mid]中,否则解在[mid,1]中,这样不断进行下去,,区间会收敛于一点,即为最后的近似解

#include <stdio.h>#include <math.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>#include <set>#include <queue>#include <stack>#include <map>using namespace std;#define eps 1e-8double p,q,r,s,t,u;double Solve (double x){return p*exp(-x)+q*sin(x)+r*cos(x)+s*tan(x)+t*x*x+u;//exp(x) 指的是e的x次方。}int main(){double left,right,mid;while(~scanf("%lf %lf %lf %lf %lf %lf",&p,&q,&r,&s,&t,&u)) {if(Solve(0)<0||Solve(1)>0)printf("No solution\n");else {left=0;right=1;while((right-left)>=eps) {mid=(left+right)/2;if(Solve(mid)<0)right=mid;elseleft=mid;}printf("%.4lf\n",mid);}}return 0;}

缘是浪漫的相遇,瞬间让你我的心化为永恒!

Solve It(二分+精度求解方程值)

相关文章:

你感兴趣的文章:

标签云: