问题 L: 求一元二次方程的根

题目描述

一元二次方程的标准形式为ax2+bx+c=0(a≠0),其中a、b、c为常数。求解一元二次方程的根x时有三种情况,分别为(记Δ=b2-4ac):

  1. Δ>0,有两个不等的实根;
  2. Δ=0,有两个相同的实根;
  3. Δ<0,有两个共轭的虚根。
    输入

输入为多行,每行为一元二次方程的三个常数a,b,c,在double类型范围之内。当输入的a为0时,表示输入结束。
输出

每行输入的样例对应三行输出。

第一行输出为样例的编号。

第二行输出为所输入常数a,b,c对应的一元二次方程的标准形式,要求输出满足a>0。

第三行输出为所输入方程的根,分为三种情况:

  1. 若方程满足Δ>0,即有两不等实根x1、x2,则按顺序(先小后大)输出这两个实根。

  2. 若方程满足Δ=0,即有两相同实根x,则输出一个实根。

  3. 若方程满足Δ<0,即有两共轭的虚根x1、x2,则输出两个虚根,虚部符号为正的(即u+vi形式)先输出,虚部符号为负的(x-yi形式)后输出。

以上输出均不输出数学上无意义或可省略的的符号,所有数值最多保留6位有效数字。每个样例之后都有一个空行分隔。

扫描二维码关注公众号,回复: 8487311 查看本文章

样例输入

1 2 1
-1 2 -1
-5 2 -0.2
-3 2 0
3 0 12
2 4 4
0

样例输出

Case 1 :
x^2 + 2x + 1 = 0
only one real root : -1

Case 2 :
x^2 - 2x + 1 = 0
only one real root : 1

Case 3 :
5x^2 - 2x + 0.2 = 0
only one real root : 0.2

Case 4 :
3x^2 - 2x = 0
two real roots : 0, 0.666667

Case 5 :
3x^2 + 12 = 0
two imaginary roots : 2i, -2i

Case 6 :
2x^2 + 4x + 4 = 0
two imaginary roots : -1+i, -1-i
#include <stdio.h>
#include <math.h>
int main()
{
	double a,b,c,d,m,x1,x2,t,s;
	int i=1;
	while(scanf("%lf",&a)&&a!=0)
	{
		if(a==0) break;
		if(a!=0)
		{
			scanf("%lf%lf",&b,&c);
			if(a<0)
			{a=-a;b=-b;c=-c;}
			printf("Case %d :\n",i);
			i++;
			if(a==1)
				printf("x^2 ");
			else 
				printf("%gx^2 ",a);
			if(b==0) ;
			else if(b==1) 
				printf("+ x ");
			else if(b==-1) 
				printf("- x ");
			else 
				printf("%c %gx ",b>0?'+':'-',fabs(b));
			if(c==0);
			else 
				printf("%c %g ",c>0?'+':'-',fabs(c));
			printf("= 0\n");
			m=b*b-4*a*c;
			d=sqrt(m);
			if(m>1e-12)
			{
				x1=(-b-d)/(2*a);
				x2=(-b+d)/(2*a);
				if(fabs(x1)<1e-6) x1=0;
				if(fabs(x2)<1e-6) x2=0;
				printf("two real roots : %g, %g\n",x1,x2);
			}
			else if(fabs(m)<1e-12)
			{
				x1=-b/(2*a);
				if(fabs(x1)<1e-6) x1=0;
				printf("only one real root : ");
				if(x1==0) printf("0\n");
				else 
					printf("%g\n",x1);
			}
			else
			{
				t=(-b)/(2*a);
				s=sqrt(4*a*c-b*b)/(2*a);
				if(fabs(t)<1e-6) t=0;
				if(fabs(s)<1e-6) s=0;
				printf("two imaginary roots : ");
				if(t==0) ;
				else 
				printf("%g",t);
				if(t==0)
				{
					if(s==1) printf("i");
					else printf("%gi",s);
				}
				else
				{
					if(s==1) printf("+i");
					else printf("+%gi",s);
				}
			printf(", ");
			if(t!=0)
				printf("%g",t);
			if(s!=1)
				 printf("-%gi\n",s);
			else 
				printf("-i\n");
		}
			printf("\n");
		}
	}
	return 0;
}
发布了99 篇原创文章 · 获赞 63 · 访问量 6219

猜你喜欢

转载自blog.csdn.net/m0_43456002/article/details/102998393