【中学】求解一元二次方程
初中的小明已经开始学习求解一元二次方程了,下面让我们来教计算机如何求解。输入 a,b,c ,求一元二次方程 ax²+bx+c=0 的根。
包括复数根
输入:
假设 a,b,c均int。
输出:
要求输出的根为 double 型,保留 6 位小数。
样例:
序号 | 测试输入 | 期待的输出 | 额外进程 |
---|---|---|---|
1 | 0 0 0↵ | Input error!↵ | 0 |
2 | 0 0 10↵ | Input error!↵ | 0 |
3 | 10 0 0↵ | x1=x2=0.000000↵ | 0 |
4 | 10 20 0↵ | x1=0.000000↵ x2=-2.000000↵ | 0 |
5 | 10 0 20↵ | x1=1.414214i↵ x2=-1.414214i↵ | 0 |
思路
先观察样例可以知道,输出应该是保留六位小数,具体是四舍五入还是直接舍弃可以通过尝试确定
同样地,观察样例,我们应该将输入分为三种情况:一元二次方程、一元一次方程和“非方程”
那么直接地,我们考虑到先分类再通过求根公式解出答案:
流程图
其中解二次方程的流程图为:
代码
#include <stdio.h>
#include <math.h>
int main()
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
if(a==0&&b==0)
printf("Input error!\n");
else if(a==0&&b!=0)
{
double ss =-(double)c/b;
printf("x=%.6lf\n",ss==0?fabs(ss):ss);
}
else
{
double Del = b*b-4*a*c,p=-b/(2.0*a),q=sqrt(fabs(Del))/(2.0*a);
if(Del==0)
printf("x1=x2=%.6lf\n",p);
else if(Del>0)
printf("x1=%.6lf\nx2=%.6lf\n",p+q,p-q);
else if(p!=0)
printf("x1=%.6lf+%.6lfi\nx2=%.6lf-%.6lfi\n",p,q,p,q);
else
printf("x1=%.6lfi\nx2=-%.6lfi\n",q,q);
}
return 0;
}
想一下为什么是
2.0*a
而不是2*a