simple description:
形如ax^3+bx^2+cx+d=0的方程,求其解
根与根之间差值的绝对值比1大
精确到小数点后4位分析:
求解高次方程的解,最简单的做法就是用零点存在定理(point 1)。
用简单枚举过于复杂而耗时。
因而选择使用分治的方法。
#include <stdio.h>
#include <math.h>
#define p 0.0001
int a, b, c, d;
double mul(double k);
double key(double a, double b);
int main() {
scanf("%d %d %d %d", &a, &b, &c, &d);
for(double i = -100; i <= 100; i ++) {
if (mul(i) == 0) {
printf("%lf\n", i);
} else if (mul(i) * mul(i + 1) < 0) {
double m = key(i, i + 1);
printf("%.4lf\n", m);
}
}
return 0;
}
double mul(double k) { //计算方程的值
double h = a * pow(k, 3) + b * pow(k, 2) + c * pow(k, 1) + d;
return h;
}
double key(double a, double b) { //零点存在定理的判断
if (mul((a + b) /2) == 0 || a + 0.0001 > b) {
return (a + b) / 2;//要么求出这个值,要么超过精确值。
} else if (mul(a) * mul((a + b) / 2) < 0) {
return key(a, (a+b) / 2);
} else if (mul(b) * mul((a + b) / 2) < 0) {
return key((a+b) / 2, b);
}
return 0;//最后一定要有这个返回值,不然会报错。
}
ps:此题有bug,无法解决根之间差值小于1的问题。
feeling:
分治算法难理解,多思考,多做题。
坚持!!