题目描述
有形如:ax3+bx2+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)之间一定有一个根。
想法:暴力枚举。
这种一看就是数学的,而且很多数字,就拿张打草纸,一点点捋清楚。
很多数学知识我们并不知道,没有学过,最好的办法就是先自己想,尝试着去了解数学知识,看懂别人的程序,再自己敲一遍(自己敲的时候适合一遍遍调试,这个时候就不要再看别人的程序了)。
# include <stdio.h>
int main(void)
{
double a,b,c,d; //涉及到小数点后两位的事情,所以double最保险。
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
double i,j;
int num =0; //计数器,够三个数就不再循环。
for(i=-100.00;i<=100.00;i=i+0.001) //按题目要求,从-100到100,因为最后结果保留两位数
{
j=i+0.001;
if((a*i*i*i+b*i*i+c*i+d)*(a*j*j*j+b*j*j+c*j+d)<0) //题目要求f(x1)*(x2)< 0
{
printf("%.2f ",i);
num++;
}
if(3 == num)
break;
}
return 0;
}