解法一
在[-100,100]大区间中递进循环,由于根与根之差的绝对值>=1,即在间隔为1的前开后闭区间里最多有一个根,从[i,i+1]中二分查找符合零点定理的解(题目中的提示即为零点定理,这里的闭区间是为了最后一个数100这个特殊情况)。
二分查找,精度设为0.001(也就是(high-low)<0.001才二分结束,小数点后第三位是唯一确定的,这时候就可以唯一确定一个精度为0.01的解了)
#include <stdio.h>
#define e(x) (d + (x) * (c + (x) * (b + a * (x))))
int main() {
double a, b, c, d, low, high, mid;
int index, resNum = 0;
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
for (index = -100; index < 100; index++) {
low = index;
high = index + 1;
if (e(low) == 0) { // 这里覆盖不到100这个数
printf("%.2lf ",low);
resNum++;
}
else if (e(low)*e(high) < 0) {
while ((high-low) >= 0.001 ) { // 100这个特殊情况交由二分查找来解决
mid = (low + high) / 2.0;
if (e(low)*e(mid) <= 0) {
high = mid;
}
else {
low = mid;
}
}
printf("%.2lf ", low);
resNum++;
}
if (resNum == 3) break; // 节约时间
}
return 0;
}
解法二
暴力轮询求解,通过小数点后两位锁定解所在的较小的一个范围,然后再次循环,间隔为0.0001,即可锁定精度为0.01的解。
#include <stdio.h>
#define e(x) (d + (x) * (c + (x) * (b + a * (x))))
int main() {
double a, b, c, d, index_dec, index;
int s = 0;
scanf("%lf%lf%lf%lf", &a, &b, &c, &d);
for (index = -100; index < 100; index += 0.01) {
if (e(index)*e(index + 0.01) <= 0) {
for (index_dec = index; index_dec <= (index + 0.01); index_dec += 0.0001) {
if (e(index_dec)*e(index_dec + 0.0001) <= 0) {
printf("%.2lf ", index_dec);
s++;
if (s == 3) {
break; // 退出内层For循环
break; // 退出外层For循环
}
}
}
}
}
return 0;
}