【Luogu1024】一元三次方程求解

Source and Judge

NOIP2001 提高组 T1
Luogu1024
Caioj1504

Problem

【Brief description】
有形如:ax^3+bx^2+c^x+d=0 这样的一个一元三次方程。
给出该方程中各项的系数,
并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。
要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。

提示:记方程f(x)=0,若存在2个数x1和x2,且x1<x2,f(x1)*f(x2)<0,则在(x1,x2)之间一定有一个根。
【Input】
4个实数A,B,C,D
【Output】
三个实根,并精确到小数点后2位
【Limited conditions】
a,b,c,d 均为实数
【Sample input】
1 -5 -4 20
【Sample output】
-2.00 2.00 5.00
【Sample explanation】

Record

10min

Analysis1

请先思考后再展开

神题……

Code1

请先思考后再展开
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//*******************头文件******************
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
#ifdef WIN32
#define BIGN "%I64d"
#else
#define BIGN "%lld"
#endif
using namespace std;
typedef long long ll;
int mymax(int x,int y) {return x>y?x:y;}
int mymin(int x,int y) {return x<y?x:y;}
//*******************全局常量****************
//*******************全局定义****************
double a,b,c,d;
//*******************实现******************
bool check(double x)
{
double t=a*x*x*x+b*x*x+c*x+d;
return (t>=-1e-6) and (t<=1e-6);
}
//*******************主函数******************
int main()
{
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
for(int i=-10000;i<=10000;i++)
{
double t=double(i)/100;
if(check(t)) printf("%.2lf ",t);
}
}

本文基于 知识共享署名-相同方式共享 4.0 国际许可协议发布
本文地址:http://zory.cf/posts/f28f.html
转载请注明出处,谢谢!

哪怕是一杯奶茶,也将鼓励我继续创作!
0%