【2031】求一元三次方程的解

Time Limit: 3 second
Memory Limit: 2 MB

有形如ax^3+bx^2+cx+d=0的一个一元三次方程。给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值≥1。要求由小到大依次在同一行输出这三个实根。(根与根之间留有空格),并精确到小数点后2位。

Input

输入文件仅一行
依次输入a,b,c,d用空格隔开

Output

输出仅一行,三个实根(根与根之间留有空格,最后用回车结束)

Sample Input

1 -5 -4 20

Sample Output

-2.00 2.00 5.00

【题解】

从-10000枚举到10000,然后除100,得到的就是-100.00到100.00,然后代入f函数,算出函数值,每次取两个值f(x1),f(x2),如果f(x1)*f(x2)<0,则表明x1-x2之间有一个解,这里我直接输出x1。因为是浮点数 所以等号无效。则相等要写成f(x)-0<0.000.......这样的形式.判断一下f(x1)或f(x2)是否近似等于0,如果是则直接输出x1或x2.

【代码】

#include <cstdio>

double a,b,c,d;
double ans[100];
int number = 0;

void input_data()
{
	scanf("%lf %lf %lf %lf",&a,&b,&c,&d); //输入a,b,c,d 
}	

double get_number(double x) //计算f(x)函数 
{
	double ans = a*x*x*x+b*x*x+c*x+d;
	return ans;
}

void get_ans()
{
	int i = -10010; //开始枚举 
	while (i <= 10010)
		{
				double temp1 = i;
				double temp2 = i+1;
				temp1 = temp1/100;
				temp2 = temp2/100;
				double d1,d2;
				d1 = get_number(temp1);d2 = get_number(temp2);
				//获取f(x1)和f(x2) 
				double j = d1 * d2; //计算f(x1)*f(x2) 
				if (j <=0)  //判断符号 
					{
						if ((0-j) < 0.00001) //如果这个值无限接近0 
							{
								if (d1 <0) d1=-d1;
								if (d2 <0) d2=-d2;
								if ((d1-0) <0.00001) ans[++number] = temp1; 
									else 
										ans[++number] = temp2;	
								//判断一下哪一个值是等于0,则增加1解 
							}	
								else
									{
										ans[++number] = temp1;
									}
						i+=98; //有提到两个解之间的差>1,则直接+100 
					} 
						else
							i++;
		}
}

void output_ans()
{
	printf("%.2lf %.2lf %.2lf\n",ans[1],ans[2],ans[3]);	//输出要用.xlf,x为保留位数 
}

int main()
{
	//freopen("E:\\rush.txt","r",stdin);
	input_data();
	get_ans();
	output_ans();
	return 0;	
}


 

posted @ 2017-10-06 19:23  AWCXV  阅读(264)  评论(0编辑  收藏  举报