【中学】求解一元二次方程

【中学】求解一元二次方程

初中的小明已经开始学习求解一元二次方程了,下面让我们来教计算机如何求解。输入 a,b,c ,求一元二次方程 ax²+bx+c=0 的根。
包括复数根

输入:

假设 a,b,c均int。

输出:

要求输出的根为 double 型,保留 6 位小数。

样例:

序号测试输入期待的输出额外进程
10 0 0↵Input error!↵0
20 0 10↵Input error!↵0
310 0 0↵x1=x2=0.000000↵0
410 20 0↵x1=0.000000↵
x2=-2.000000↵
0
510 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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值