【入门】洛谷P1024:一元三次方程求解 两种解法

解法一

在[-100,100]大区间中递进循环,由于根与根之差的绝对值>=1,即在间隔为1的前开后闭区间里最多有一个根,从[i,i+1]中二分查找符合零点定理的解(题目中的提示即为零点定理,这里的闭区间是为了最后一个数100这个特殊情况)。
二分查找,精度设为0.001(也就是(high-low)<0.001才二分结束,小数点后第三位是唯一确定的,这时候就可以唯一确定一个精度为0.01的解了)

#include 
#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 
#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;
}

你可能感兴趣的:(【入门】洛谷P1024:一元三次方程求解 两种解法)