給定三次多項式 f(x) = a₃x³ + a₂x² + a₁x + a₀ 及區間 [a, b],保證區間內存在唯一單根。用二分法求根,精確到小數點後 2 位。
f(a) * f(b) ≥ 0 則無根或偶數根(題目保證唯一單根,故必 < 0)mid = (a+b)/2f(mid) == 0 → 直接輸出f(mid) * f(a) > 0 → 根在 [mid, b],令 a = mid[a, mid],令 b = mid#include <cstdio>
#include <cmath>
using namespace std;
double a3, a2, a1, a0;
double L, R;
const double EPS = 1e-8;
double f(double x) {
return a3*x*x*x + a2*x*x + a1*x + a0;
}
int main() {
scanf("%lf %lf %lf %lf", &a3, &a2, &a1, &a0);
scanf("%lf %lf", &L, &R);
double mid;
while (R - L > EPS) {
mid = (L + R) / 2;
if (f(mid) == 0) break;
if (f(mid) * f(L) > 0) L = mid;
else R = mid;
}
printf("%.2lf\n", mid);
return 0;
}
x*x*x 而非 pow(x,3),效率更高且精度更好