7-25 解一元二次方程 (10 分)
解一元二次方程
请编写程序,解一元一次方程 ax2+bx+c=0 。
一元二次方程的求根公式为:
要求:
- 若 a=0,则为一元一次方程。
- 若 b=0,则方程有唯一解,输出这个解;
- 若 b=0,c=0,则方程无解,输出“无解”;
- 若 b=0,c=0,则方程有无穷多解,输出“无穷多解”。
- 若 a=0,则为一元二次方程。
- 若 Δ>0,则方程有两个不等的实根,输出这两个根;
- 若 Δ=0,则方程有两个相等的实根,输出这两个根;
- 若 Δ<0,则方程有两个共轭的虚根,输出这两个根。
输入格式
a,b,c
输出格式
x 或 x1,x2
注:所有实数均输出6位有效数字,且不输出末尾无意义的0和小数点。
输入样例1
0 4.5 -3.6
结尾无空行
输出样例1
x = 0.8
结尾无空行
输入样例2
0 2.8 0
结尾无空行
输出样例2
x = 0
结尾无空行
输入样例3
0 0 3.6
结尾无空行
输出样例3
无解
结尾无空行
输入样例4
0 0 0
结尾无空行
输出样例4
无穷多解
结尾无空行
输入样例5
-2 0.8 -0.06
结尾无空行
输出样例5
x1 = 0.1, x2 = 0.3
结尾无空行
输入样例6
-1 0.2 0
结尾无空行
输出样例6
x1 = 0, x2 = 0.2
结尾无空行
输入样例7
1 -0.4 0.04
结尾无空行
输出样例7
x1 = x2 = 0.2
结尾无空行
输入样例8
0.3 0 0
结尾无空行
输出样例8
x1 = x2 = 0
结尾无空行
输入样例9
-0.2 0.04 -0.01
结尾无空行
输出样例9
x1 = 0.1-0.2i, x2 = 0.1+0.2i
结尾无空行
输入样例10
3 0 0.27
结尾无空行
输出样例10
x1 = 0+0.3i, x2 = 0-0.3i
结尾无空行
提示:注意实数的负零问题和误差问题。
#include <stdio.h>
#include <math.h>
int main()
{
double a,b,c,s,x1,x2,m,p,q;
scanf("%lf %lf %lf",&a,&b,&c);
s=b*b-4*a*c;
m=(-c)/b;
x1=(-b+sqrt(s))/(2*a);
x2=(-b-sqrt(s))/(2*a);
p=-b/(2*a);
q=sqrt(fabs(s))/(2*a);
if(a == 0)
{
if(m==-0) m=0;
if(b!=0)
{
printf("x = %.6g",m);
}
if(b==0&&c!=0)
{
printf("无解");
}
if(b==0&&c==0)
{
printf("无穷多解");
}
}
if(a!=0)
{
if(p==-0) p=0;
if(s>0.000001)
{
printf("x1 = %.6g, x2 = %.6g",p+q,p-q);
}
if(s<0.000001&&s>-0.000001)
{
printf("x1 = x2 = %.6g",p);
}
if(s<0)
{
printf("x1 = %.6g+%.6gi, ",p,q);
printf("x2 = %.6g-%.6gi",p,q);
}
}
return 0;
}