洛谷题解 P1024 【一元三次方程求解】

原题传送门

题目描述

有形如:ax3+bx2+cx1+dx0=0这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值≥1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。

提示:记方程f(x)=0,若存在2个数x1和x2,且x1<x2,f(x1)*f(x2)<0,则在(x1,x2)之间一定有一个根。

输入格式

一行,44个实数A,B,C,DA,B,C,D。

输出格式

一行,33个实根,并精确到小数点后22位。

输入输出样例

输入 #1

1 -5 -4 20

输出 #1

-2.00 2.00 5.00
--------------------------------------------以下为题解部分-----------------------------------------------

分析:

思路:

首先这个题是一道数学题,要求是求出实根,所以我们自然而然的想起一种玄学的方法,那就是——

暴力枚举法

对于这个题来说,数据范围表明了实根的范围在-100和100之间,枚举的话,不会爆,只不过慢点罢了

But

这个题有一个要注意的地方,枚举时精度要到0.001,要不然就。。。。。。
不多说,上AC代码

代码:

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main(){
	ios::sync_with_stdio(false);
	double a,b,c,d;
    cin>>a>>b>>c>>d;
    for(double i=-100;i<=100;i+=0.001){			//枚举所有可能的根 。 
        if(fabs(i*i*i*a+i*i*b+i*c+d)<0.0001)	//计算绝对值,若这个式子的结果的绝对值小于0.001, 
        										//(即<枚举精度),则为方程的一个根。 
            cout<<fixed<<setprecision(2)<<i<<" ";
    }
    return 0;
}
本文欢迎转载,转载时请注明本文链接
原文地址:https://www.cnblogs.com/-pwl/p/12287744.html