洛谷1024

  1. 题意:求解一元三次方程的根
  2. 解题:记方程f(x)=0,若存在2个数x1x2,且x1<x2f(x1) *f(x2)<0,则(x1,x2)之间一定有一个根。
    初始是采用暴力求解法。两根的绝对之差>1,则在[i,i+1]之间必有一根。先暴力求出对应的i值
    之后采用二分法。
  3. 代码:
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    double a, b, c, d;
    double f(double x)
    {
        return (x * x * x * a + x * x * b + x * c + d);//计算一元三次方程的值
    }
    int main()
    {
        double x1, x2, xx;
        cin>>a>>b>>c>>d;//都是实数,不一定非是整数 
        for (double i = -100; i <= 100; i++) {//分别枚举
            x1 = i; x2 = i + 1;
            if (f(x1) == 0)//说明为零,直接输出
                printf("%.2lf ", i);
            if (f(x1) * f(x2) < 0) {//小于零说明有零点,即说明有解。
                while (x2 - x1 >= 0.001) {//范围 
                    xx = (x1 + x2) / 2;//二分
                    if (f(x1) * f(xx) <= 0)//判断零点在x1到xx还是xx到x2
                        x2 = xx;//更新 
                    else
                        x1 = xx;
                }
                printf("%.2lf ", x1);//输出 
            }
        }
    }

     

posted @ 2020-12-17 11:16  Quella'  阅读(85)  评论(0)    收藏  举报
Live2D