Luogu P1024题解
程序员文章站
2022-05-09 10:05:07
...
题目描述:
对于一个一元三次方程,我们给出各个项的系数,现在需要你找出这个一元三次方程的三个根,保证根的大小-100~100
且根于根之间差的绝对值大于1。
题解:
已经知道了每个根的限制条件,我们就可以把-100~100
这个区间按区间长度1来分,每个区间上二分查询一次答案,这里注意,我们是在实数域上进行二分,所以要有精度的要求。题中说明结果取小数点后2位,那么我们放到后三位即可。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
double A,B,C,D;
double F(double x)
{
return A * x * x * x + B * x * x + C * x + D;
}
int main()
{
scanf("%lf%lf%lf%lf",&A,&B,&C,&D);
int s = 0;
for(int i = -100;i <= 100;i++){
double l = i,r = i + 1.0;
double x1 = F(l),x2 = F(r);
if(!x1){ //左边界判断,注意我们对i的取值是1-100所以只需要判断左边界即可
s++;
printf("%.2f ",l);
}
if(x1 * x2 < 0){ //有根
while(r - l >= 0.001){
double mid = (l + r) / 2.0;
if(F(mid) * F(l) < 0) r = mid;
else if(F(mid) * F(r)) l = mid;
}
printf("%.2f ",r);
s++;
}
if(s == 3) break; //找到三个根就直接跳出
}
return 0;
}
上一篇: poj 3714 Raid