编译不过去
#include
#include
int main()
{
double a,b,c,d,x1,x2;
scanf("%lf%lf%lf",&a,&b,&c);
d=sqrt(b*b-4*a*c);
if(a==0)
{
if(b!=0)
{
printf("x = %6g\n",-c/b);
}
else if((b==0)&&(c!=0))
printf("无解\n");
else if(b==0&&c==0)
printf("无穷多解\n");
}
else if(a!=0)
{
if(d>0)
{
printf("x1 = %6g, x2 = %6g\n",(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a));
}
else if(d==0)
{
printf("x1 = x2 = %.6g\n",-b/2/a);
}
else if(d<0)
{
printf(x1 = %6g+%6gi,x2 = %6g+%6gi\n,-b/2/a,sqrt(d)/2a,-b/2/a,-sqrt(d)/2a);
}
}
return 0;
}
请编写程序,解一元一次方程 ax
2
+bx+c=0 。
已知一元二次方程的求根公式为:
要求:
(1) 若 a=0,则为一元一次方程。
若 b
=0,则方程有唯一解,输出这个解;
若 b=0,c
=0,则方程无解,输出“无解”;
若 b=0,c=0,则方程有无穷多解,输出“无穷多解”。
(2) 若 a
=0,则为一元二次方程。
若 Δ>0,则方程有两个不等的实根,输出这两个根;
若 Δ=0,则方程有两个相等的实根,输出这两个根;
若 Δ<0,则方程有两个共轭的虚根,输出这两个根。
输入格式
a,b,c
输出格式
x 或 x
1
,x
2
注:所有实数均输出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
提示:注意实数的负零问题和误差问题。
31行改
printf("x1 = % 6g + % 6gi, x2 = % 6g + % 6gi\n", -b / 2 / a, sqrt(d) / 2 * a, -b / 2 / a, -sqrt(d) / 2 * a);
语法都是错的
#include<stdio.h>
#include<math.h>
int main()
{
double a,b,c,d,x1,x2;
scanf("%lf%lf%lf",&a,&b,&c);
d=sqrt(b*b-4*a*c);
if(a==0)
{
if(b!=0)
{
printf("x = %6g\n",-c/b);
}
else if((b==0)&&(c!=0))
printf("无解\n");
else if(b==0&&c==0)
printf("无穷多解\n");
}
else
{
if(d>0)
{
printf("x1 = %6g, x2 = %6g\n",(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a));
}
else if(d==0)
{
printf("x1 = x2 = %.6g\n",-b/2/a);
}
else if(d<0)
{
printf("x1 = %6g+%6gi,x2 = %6g+%6gi\n",-b/2/a,sqrt(d)/2/a,-b/2/a,-sqrt(d)/2/a);
}
}
return 0;
}
现在编译过去了,但是结果还是不对,好好看看逻辑吧
#include<stdio.h>
#include<math.h>
int main()
{
double a,b,c,d,x1,x2;
scanf("%lf%lf%lf",&a,&b,&c);
d=sqrt(b*b-4*a*c);
if(a==0)
{
if(b!=0)
{
printf("x = %6g\n",-c/b);
}
else if((b==0)&&(c!=0))
printf("无解\n");
else if(b==0&&c==0)
printf("无穷多解\n");
}
else if(a!=0)
{
if(d>0)
{
printf("x1 = %6g, x2 = %6g\n",(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a));
}
else if(d==0)
{
printf("x1 = x2 = %.6g\n",-b/2/a);
}
else if(d<0)
{
printf("x1 = %6g+%6gi,x2 = %6g+%6gi\n",-b/2/a,sqrt(d)/2*a,-b/2/a,-sqrt(d)/2*a);
}
}
return 0;
}
因为有打印出-0以及打印复数根的情况,所以对这两种种情况进行了一下判断再处理,修改如下:
参考链接:
#include<stdio.h>
#include<math.h>
int main()
{
// https://www.runoob.com/cplusplus/cpp-examples-quadratic-roots.html
// https://baike.baidu.com/item/%E4%B8%80%E5%85%83%E4%BA%8C%E6%AC%A1%E6%96%B9%E7%A8%8B%E6%B1%82%E6%A0%B9%E5%85%AC%E5%BC%8F/56066624?fr=aladdin
// https://blog.csdn.net/qq_41757528/article/details/126376583
// http://c.biancheng.net/view/1763.html
double a,b,c,d,x1,x2;
scanf("%lf%lf%lf",&a,&b,&c);
d=b*b-4*a*c;
//printf("%g\n",0.1234567);
// printf("d=%f\n",d);
if(a==0)
{
if(b!=0) // https://www.renrendoc.com/paper/109826644.html 第3题
{ // https://www.zhihu.com/question/429890476/answer/1571363510
double p = -c/b;
if(p==0){ // 针对打印-0的情况
printf("x = 0\n");
}else{
printf("x = %g\n",p);
}
}
else if((b==0)&&(c!=0))
printf("无解\n");
else if(b==0&&c==0)
printf("无穷多解\n");
}
else if(a!=0)
{ // https://blog.csdn.net/qq_41583263/article/details/113751810
if(d>0) // 判别式大于0的情况 https://baijiahao.baidu.com/s?id=1722370687157957463&wfr=spider&for=pc 第三题
{
printf(" x1 = %g, x2 = %g\n",(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a));
}
else if(fabs(d)<=1e-15) // 判别式等于0的情况 https://baijiahao.baidu.com/s?id=1722370687157957463&wfr=spider&for=pc 第16题
{
double p = -b/(2*a);
if(p==0){ // 针对打印-0的情况
p=0;
}
printf("x1 = x2 = %g\n",p);
}
else if(d<0) // https://qb.zuoyebang.com/xfe-question/question/aecfcb8e38f761d3fa704d540264593b.html
{ // https://www.runoob.com/cplusplus/cpp-examples-quadratic-roots.html
double p = -b/(2*a);
double k = sqrt(-d)/(2*a);
if(p==0){ // 针对打印-0的情况
p=0;
}
if(k==0){
printf("x1 = %g+%gi,x2 = %g-%gi\n",p,0,p,0);
}else if (k<0){
printf("x1 = %g%gi,x2 = %g+%gi\n",p,k,p,-1*k);
}else{
printf("x1 = %g+%gi,x2 = %g-%gi\n",p,k,p,k);
}
}
}
return 0;
}