用户:
happy_chicken查看:6 回复:5 评论:6 创建时间:2023-12-05T18:58:42
题目描述:形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。
给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在−100至100之间),且根与根之差的绝对值≥1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
1.0 -5.0 -4.0 20.0 样例输出
复制
-2.00 2.00 5.00
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
double a,b,c,d;
int num_of_times=0;
cin>>a>>b>>c>>d;
for(double x=-100;x<=100;x++){//ax^3+bx^2+cx+d
if(num_of_times>=3)
break;
if((a*x*x*x+b*x*x+c*x+d)==0){
printf("%.2f ",x);
num_of_times++;
}
if((a*x*x*x+b*x*x+c*x+d)*(a*(x+1)*(x+1)*(x+1)+b*(x+1)*(x+1)+c*(x+1)+d)<0){
double mid,left=x,right=x+1;
bool flag=false;
while(left-right>=0.0001){
mid=(left+right)/2;
if((a*mid*mid*mid+b*mid*mid+c*mid+d)>0)
right=mid;
else if((a*mid*mid*mid+b*mid*mid+c*mid+d)<0)
left=mid;
}
printf("%.2f ",left);
num_of_times++;
}
}
return 0;
}
/**************************************************************
Problem: 1237
User: zhaoweizhuo666 [zhaoweizhuo666]
Language: C++
Result: 答案错误
****************************************************************/
思想:
就是个求三个实根,不很简单,套个数学公式,可是:
写喜人!感觉枚举太土,于是使用二分:
画了个很好看的图,然后就做了
done。。。
PlumSteven附我当时写的代码(老早之前了),这码风大概是我去年的。
//盛金公式,自己写的(真的)
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
double a, b, c, d;
cin >> a >> b >> c >>d;
//先算出A,B,C
/*
A=b2-3ac
B=bc-9ad
C=c2-3bd
*/
double A = 1.0*pow(b, 2)-3*a*c;
double B = 1.0*b*c-9*a*d;
double C = 1.0*pow(c, 2)-3*b*d;
//判别式Δ=B2-4AC
double Delta=1.0*pow(B, 2)-4*A*C;
//题目明确表示,方程有三个不相等的实根,则使用盛金公式4
//即Δ<0的情况
//X1=(-b-2√A cos(θ/3))/3a
//X2=(-b+√A(cos(θ/3)+√3 sin(θ/3)))/3a
//X3=(-b+√A(cos(θ/3)-√3 sin(θ/3)))/3a
//其中θ=arccos T
//T=(2Ab-3aB)/(2*√A3)
double T = (2*A*b-3*a*B)/(2*sqrt(pow(A,3)));
double theta = acos(T);
//为了从小到大排列,采用数组
double x[3];
x[0] = (-b-2*sqrt(A)*cos(theta/3))/3*a;
x[1] = (-b+sqrt(A)*(cos(theta/3)+sqrt(3)*sin(theta/3)))/3*a;
x[2] = (-b+sqrt(A)*(cos(theta/3)-sqrt(3)*sin(theta/3)))/3*a;
//排序
sort(x, x+3);
printf("%.2lf %.2lf %.2lf", x[0], x[1], x[2]);
return 0;
}
洛谷上可以过
点赞0
评论