题意:
给你一个关于x的方程,给出变量的值,求出x;
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 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 (where0 <= p,r <= 20 and-20 <=q,s,t <= 0). There will be maximum 2100 lines in the input file.
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.
0 0 0 0 -2 1
1 0 0 0 -1 2
1 -1 1 -1 -1 1
0.7071
No solution
思路:代码:
#include <iostream>// 二分查找,
#include <algorithm>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int maxn=105;
const int base=1000;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
const double pi=acos(-1.0);
double p,q,r,s,t,u;
double fun(double x)
{
return p*exp(-x)+q*sin(x)+r*cos(x)+s*tan(x)+t*pow(x,2)+u;
}
int main()
{
int n,m,i,j;
while(~scanf("%lf%lf%lf%lf%lf%lf",&p,&q,&r,&s,&t,&u))
{
int sum=0;
double left=0, right=1, mid;
bool flag=false;
if(fun(left)*fun(right)>0) //在同一侧,无解
{
printf("No solution\n");
continue;
}
while(right-left>eps) //二分逼近
{
mid=(left+right)/2;
if(fun(mid)*fun(left)>0) left=mid;
else right=mid;
}
printf("%.4f\n",mid);
}
return 0;
}
原文地址:http://blog.csdn.net/u013050857/article/details/43086569