有形如:ax^3+bx^2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
提示:记方程f(x)=0,若存在2个数x1和x2,且x1<x2,f(x1)*(x2)<0,则在(x1,x2)之间一定有一个根。
input:
输入该方程中各项的系数(a,b,c,d 均为实数),
output:
由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
input:
1 -5 -4 20
output:
-2.00 2.00 5.00
【参考程序】:
#include<cstring>
#include<cstdio>
using namespace std;
double ans[4];
double a,b,c,d;
double f(double xt)
{
double s;
s=xt*xt*xt+b*xt*xt+c*xt+d;
return s;
}
int main()
{
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
b/=a; c/=a; d/=a;
double x1,x2; int p=0;
for (int x=-10000;x<=10000;x++)
{
x1=(x-0.05)/100.0; x2=(x+0.05)/100.0;
if (f(x/100.0)==0 || f(x1)*f(x2)<0)
{
p++; ans[p]=x/100.0;
}
if (p==3) break;
}
for (int i=1;i<=2;i++)
for (int j=2;j<=3;j++)
if (ans[i]>ans[j])
{
double t=ans[i];ans[i]=ans[j];ans[j]=t;
}
for (int i=1;i<=p-1;i++)
printf("%.2lf ",ans[i]);
printf("%0.2lf\n",ans[p]);
return 0;
}
【参考程序】:
var a,b,c,d,x1,x2,tt:double;
x,i,j,k:longint;
ans:array[1..3]of double;
function f(xx:double):double;
begin
f:=xx*xx*xx+b*xx*xx+c*xx+d;
end;
begin
//while not eof do
//begin
read(a,b,c,d);
b:=b/a;c:=c/a;d:=d/a;a:=1;
k:=0;
for x:=-10000 to 10000 do
begin
x1:=(x-0.005)/100;x2:=(x+0.005)/100;
if (f(x1)*f(x2)<0)or(f(x2)=0) then
begin
inc(k);
ans[k]:=x/100;
end;
end;
for i:=1 to 2 do
for j:=i+1 to 3 do
if ans[i]>ans[j] then
begin
tt:=ans[i];ans[i]:=ans[j];ans[j]:=tt;
end;
for i:=1 to 2 do write(ans[i]:0:2,' ');
writeln(ans[3]:0:2);
//end;
end.