关闭

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

标签: 算法
306人阅读 评论(0) 收藏 举报
分类:

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:130150次
    • 积分:3141
    • 等级:
    • 排名:第10906名
    • 原创:187篇
    • 转载:16篇
    • 译文:2篇
    • 评论:18条
    文章分类
    最新评论