欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(╥╯^╰╥) 一元三次方程求解

程序员文章站 2022-05-09 13:33:25
...

Description

  有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求三个实根。。

Input

输入描述:

  四个实数:a,b,c,d

输入样例:

1 -5 -4 20

Output

输出描述:

  由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位

输出样例:

-2.00 2.00 5.00

题解:根的范围在-100--100之间,且要精确到后俩位,我们可以把根的范围过大100倍,x1=(x-0.05)/100,x2=(x+0.05)/100,根据根的特点可以确定f(x1)*f(x2)<0,因此遇到这种情况即是满足情况的解。

//枚举
#include<cstdio>
#include<cmath>
#include<cstdlib>
using namespace std;
double a,b,c,d;
int main()
{
    double x;
    scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
    for (x=-100;x<=100;x+=0.01)
    {
        if (abs(a*x*x*x+b*x*x+c*x+d)<=0.00001)
            printf("%.2f ",x);
    }
} 
//二分
#include <cstdio>   
#include <iostream>  
#include <map>  
#include <set>  
#include <vector>  
#include <stack>  
#include <cmath>  
#include <string>  
#include <cstring>  
#include <algorithm>  
#define LL long long    
using namespace std;  
double ans1, ans2, ans3;  
double a, b, c, d;  
double l, r, mid;  
  
  
double f1(double x){  
    return x*x*x*a + x*x*b + x*c +d;      
}  
  
double F(double x, double y){  
    l = x; r = y;  
    while(l < r){  
        mid = (l+r) / 2.0;  
        double ans1 = f1(l);  
        double ans2 = f1(mid);  
        if((ans1*ans2) <= 0)  
            r = mid;          
        else  
            l = mid + 0.00001;  
    }  
    return r;  
}  
  
int main(){  
  
    while(scanf("%lf%lf%lf%lf",&a,&b,&c,&d) != EOF){  
        for(double i = -100; i <= 100; i++){  
            double ans1 = f1(i);  
            double ans2 = f1(i+1);  
            if(ans1 == 0)  
                printf("%.2f ",i);  
              
            if((ans1*ans2) < 0){  
                ans1 = F(i, i+1.0);  
                printf("%.2f ",ans1);  
            }  
        }  
        printf("\n");     
    }  
    return 0;  
}  
//某位大佬
#include<iostream>
#include<string>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
 
using namespace std;
const double eps = 1e-6;//1e-8、1e-6都能ac
double a, b, c, d;
bool isok(double x) {
	double res = a * x*x*x + b * x*x + c * x + d;
	if (abs(res - 0) < eps)
		return true;
	else
		return false;
}
int main(void) {
	scanf("%lf%lf%lf%lf", &a, &b, &c, &d);
	vector<double> res;
	for (double x = -100.00; x <= 100.00; x += 0.01) {
		if (isok(x))
			res.push_back(x);
	}
	for (int i = 0; i < 3; ++i) {
		printf("%.2lf", res[i]);
		if (i != 2)
			printf(" ");
		else
			printf("\n");
	}
	return 0;
}