大意:给你一方程,让你求零点。
思路:对函数求导,知道它是单调递减的。由于保留4位小数,可以通过二分枚举大于1e-9的方法求零点而不会无限循环。
CODE:
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define eps 1e-9
double p, q, r, s, t, u;
double f(double x)
{
return p*exp(-x) + q*sin(x) + r*cos(x) + s*tan(x) + t*x*x+u;
}
void solve()
{
double s1 = f(0), s2 = f(1);
if(s1*s2 > 0)
{
printf("No solution\n");
}
else
{
double x = 0.0, y = 1.0, ans, m;
while(y-x > eps)
{
m = x+(y-x)/2.0;
ans = f(m);
if(ans < 0) y = m;
else x = m;
}
printf("%.4lf\n", y);
}
}
int main()
{
while(~scanf("%lf%lf%lf%lf%lf%lf", &p, &q, &r, &s, &t, &u))
{
solve();
}
return 0;
}
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define eps 1e-9
double p, q, r, s, t, u;
double f(double x)
{
return p*exp(-x) + q*sin(x) + r*cos(x) + s*tan(x) + t*x*x+u;
}
void solve()
{
double s1 = f(0), s2 = f(1);
if(s1*s2 > 0)
{
printf("No solution\n");
}
else
{
double x = 0.0, y = 1.0, ans, m;
while(y-x > eps)
{
m = x+(y-x)/2.0;
ans = f(m);
if(ans < 0) y = m;
else x = m;
}
printf("%.4lf\n", y);
}
}
int main()
{
while(~scanf("%lf%lf%lf%lf%lf%lf", &p, &q, &r, &s, &t, &u))
{
solve();
}
return 0;
}