一元三次方程求解(有bug)——分治

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:
分治算法难理解,多思考,多做题。
坚持!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值