7-10 解一元二次方程
分数 20
全屏浏览
切换布局
作者 李祥
单位 湖北经济学院
请编写程序,解一元一次方程 ax2+bx+c=0 。
已知一元二次方程的求根公式为:
要求:
- 若 a=0,则为一元一次方程。
- 若 b=0,则方程有唯一解,输出这个解;
- 否则 b=0,
- 若 c=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
-3 1.2 -0.12
输出样例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
提示:注意实数的负零问题和误差问题。
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#include<stdio.h>
#include<math.h>
int main()
{double a,b,c;scanf("%lf %lf %lf",&a,&b,&c);if(a==0){if(b!=0){printf("x = %.6g",fabs(c/b));}if(b==0&&c!=0) printf("无解");if(b==0&&c==0) printf("无穷多解");}else{double diff=pow(b,2)-4*a*c;if(diff-(int)diff>0.000001){double x1,x2;if(b==sqrt(diff)) x1=0;//注意判断分子else x1=(-b+sqrt(diff))/(2*a);if((sqrt(diff)*-1)==b) x2=0;//注意判断分子else x2=(-b-sqrt(diff))/(2*a);printf("x1 = %.6g, x2 = %.6g",x1,x2);}else if(diff<0.000001&&diff>-0.000001){double x1;if(b==0) x1=0;//注意判断分子else x1=(-b+sqrt(diff))/(2*a);if(diff-(int)diff<0.000001) printf("x1 = x2 = %.6g",x1);}else{diff=fabs(diff);double p=sqrt(diff)/(2*a),q;if(b==0) q=0;//注意判断分子else q=-b/(2*a);if(p<=0) printf("x1 = %.6g-%.6gi,",q,fabs(p));//注意判断如果p是负数那么是减else printf("x1 = %.6g+%.6gi,",q,p);//注意判断如果p是正数那么是加if(p<=0)printf(" x2 = %.6g+%.6gi",q,fabs(p));//注意判断如果p是负数那么是加else printf(" x2 = %.6g-%.6gi",q,p);//注意判断如果p是正数那么是减}}return 0;
}