目前主要分为三个专栏,后续还会添加:
感谢阅读!
初来乍到,如有错误请指出,感谢!
描述
从键盘输入a, b, c的值,编程计算并输出一元二次方程ax2 + bx + c = 0的根,当a = 0时,输出“Not quadratic equation”,当a ≠ 0时,根据△ = b2 - 4*a*c的三种情况计算并输出方程的根。
输入描述:
多组输入,一行,包含三个浮点数a, b, c,以一个空格分隔,表示一元二次方程ax2 + bx + c = 0的系数。
输出描述:
针对每组输入,输出一行,输出一元二次方程ax2 + bx +c = 0的根的情况。
如果a = 0,输出“Not quadratic equation”;
如果a ≠ 0,分三种情况:
△ = 0,则两个实根相等,输出形式为:x1=x2=...。
△ > 0,则两个实根不等,输出形式为:x1=...;x2=...,其中x1 <= x2。
△ < 0,则有两个虚根,则输出:x1=实部-虚部i;x2=实部+虚部i
即x1的虚部系数小于等于x2的虚部系数,实部为0时不可省略。
实部= -b / (2*a),虚部= sqrt(-△ ) / (2*a)
所有实数部分要求精确到小数点后2位,数字、符号之间没有空格。
思路 :
使用sqrt函数求平方
按照公式一步一步去写程序
AI 解题思路
代码 1 :
# include <stdio.h>
# include <math.h>//会用到sqrt函数
void check_equation(float a,float b,float c)
{
float x1=0,x2=0;
if(a==0) //两个根
{
printf("Not quadratic equation\n");
}
else //a不为0的情况
{
float M =(b*b)-4*a*c;//后面不用计算,提升效率,判断式
//定义变量,用来判断b2 - 4*a*c是否等于0
/*
if (a==0)
{
printf("Not quadratic equation\n");
}
else//a不为0的情况
*/
if (M==0) //两根相等
{
float x = b/(-2*a);//相等的求跟公式
if(x == 0) //x等于0.00时总是以-0.00显示
{
printf("x1=x2=0.00\n");
}
else
{
printf("x1=x2=%.2f\n",x);
}
}
else if (M>0) //两根为实根
{
x1 = (-b+sqrt(M))/(2*a);
x2 = (-b-sqrt(M))/(2*a); //求根公式
if (x1<=x2) //小的根一定在前面
{
printf("x1=%.2f;x2=%.2f\n",x1,x2);
}
else
{
printf("x1=%.2f;x2=%.2f\n",x2,x1);
}
}
else //两个为虚根
{
float shi = -b/(2*a);//虚部,虚部和实部不能相加
float xu = sqrt(-M)/(2*a);//一定是正数
//直接打印
//因为虚部显示是相反数,而xu一定为正数
//所以x1 一定是“-”减号字符,x2一定是“+”加号字符
printf("x1=%.2f-%.2fi;x2=%.2f+%.2fi",shi,xu,shi,xu);
}
}
}
int main ()
{
float a,b,c;
//定义变量
while (scanf("%f %f %f",&a,&b,&c)!=EOF) //如果在成功读取任何数据之前发生任何情况
//则返回 EOF。
{
check_equation(a,b,c);//求根函数
}
return 0;
}
代码 2 :
#include <stdio.h>
#include <math.h>
int main()
{
//因子
float a = 0.0f;
float b = 0.0f;
float c = 0.0f;
//判别式
float disc = 0.0f;
//实数根
float root1 = 0.0f;
float root2 = 0.0f;
//共轭复数的实部与虚部
float real = 0.0f;
float imag = 0.0f;
//录入数据
while(scanf("%f%f%f", &a, &b, &c) == 3)
{
//判断是否为一元二次方程
if(a == 0.0)
{
printf("Not quadratic equation\n");
continue;
}
//求根公式的判别式
disc = b * b - 4 * a * c;
//进入求根流程
if (disc <= 1e-6 && disc >= -1e-6)//有2个相同实数根
{
root1 = (-b + sqrt(disc)) / (2 * a);
//消除-0.0的情况
if(root1 <= 1e-6 && root1 >= -1e-6)
{
root1 = root2 = 0.0;
}
printf("x1=x2=%.2f\n", root1);
}
else if (disc > 0.0)//有2个不同实数根
{
root1 = (-b - sqrt(disc)) / 2 / a;
root2 = (-b + sqrt(disc)) / 2 / a;
printf("x1=%.2f;x2=%.2f\n", root1, root2);
}
else//有2个共轭复数根
{
real = -b / 2 / a;
imag = sqrt(-disc) / 2 / a;
printf("x1=%.2f-%.2fi;x2=%.2f+%.2fi\n", real, imag, real, imag);
}
}
return 0;
}
代码 3 :
#include <stdio.h>
#include <math.h>
int main() {
double a, b, c, root, x1, x2;
while (scanf("%lf %lf %lf", &a, &b, &c) != EOF) {
getchar();
if (a == 0) {
printf("Not quadratic equation\n");
} else if (a != 0) {
root = pow(b, 2) - (4 * a * c);
// 两个根相等
if (root == 0) {
// 求根公式
x1 = ((-b) + sqrt(root)) / (2 * a);
// 将-0.00变为0
x1 == 0 ? x1 = 0 : x1;
printf("x1=x2=%.2lf\n", x1);
}
// 两个根不等
else if (root > 0) {
// 求根公式
double temp;
x1 = ((-b) + sqrt(root)) / (2 * a);
x2 = ((-b) - sqrt(root)) / (2 * a);
// 检测x1 <= x2?
x1 <= x2 ?
printf("x1=%.2lf;x2=%.2lf\n", x1, x2) :
printf("x1=%.2lf;x2=%.2lf\n", x2, x1);
}
// 两个虚根
else if (root < 0) {
// 求虚根1的实部x1,虚部x2
x1 = (-b) / (2 * a);
x2 = sqrt(-root) / (2 * a);
printf("x1=%.2lf-%.2lfi;", x1, x2);
// 求虚根2的实部x1,虚部x2
x1 = (-b) / (2 * a);
x2 = sqrt(-root) / (2 * a);
printf("x2=%.2lf+%.2lfi\n", x1, x2);
}
}
}
return 0;
}
扩展 : C 库函数 - sqrt()
描述
C 库函数 double sqrt(double x) 返回 x 的平方根。
声明
下面是 sqrt() 函数的声明。
double sqrt(double x)
参数
- x -- 浮点值。
返回值
该函数返回 x 的平方根。
实例
下面的实例演示了 sqrt() 函数的用法。
#include <stdio.h>
#include <math.h>
int main ()
{
printf("%lf 的平方根是 %lf\n", 4.0, sqrt(4.0) );
printf("%lf 的平方根是 %lf\n", 5.0, sqrt(5.0) );
return(0);
}
让我们编译并运行上面的程序,这将产生以下结果:
4.000000 的平方根是 2.000000
5.000000 的平方根是 2.236068