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

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;
}

猜你喜欢

转载自blog.csdn.net/henu111/article/details/81189376