P1024 [NOIP2001 提高组] 一元三次方程求解
单位为1的区间内只有一个根且范围在-100 ~ 100之内直接遍历即可,把在端点的根和在中间的根分开讨论。
#include <iostream>
#include <cstdio>
#include <map>
#include <algorithm>
#define rep(n) for(int i = 1; i <= n; i ++)
using namespace std;
double a, b, c, d;
int cnt;
double f(double x)
{
return a*x*x*x + b*x*x + c*x + d;
}
int main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);
cin >> a >> b >> c >> d;
for(int i = -100; i < 100; i ++)
{
double l = i, r = i + 1;
double f1 = f(l);
double f2 = f(r);
if (!f1)
{
cnt ++;
printf("%.2lf ", l);
}
if (f1 * f2 < 0)
{
while(r - l >= 0.001)
{
double mid = (l + r) / 2;
if(f(mid)*f(r) <= 0) l = mid;
else r = mid;
}
printf("%.2lf ", r);
cnt ++;
}
if (cnt == 3) break;
}
return 0;
}