题目要求:
求方程 的根,用三个函数分别求当b^2-4ac大于0、等于0、和小于0时的根,并输出结果。从主函数输入a、b、c的值。

解题思路:
一元二次方程
只含有一个未知数(一元),并且未知数项的最高次数是2(二次)的整式方程叫做一元二次方程。

一般式:ax²+bx+c=0(a≠0)。
其中ax²叫作二次项,a是二次项系数;bx叫作一次项,b是一次项系数;c叫作常数项

求根公式:

利用一元二次方程根的判别式可以判断方程的根的情况
▲ = b² - 4ac

一元二次方程的根与根的判别式 有如下关系:
① 当 ▲ > 0 时,方程有两个不相等的实数根;
② 当 ▲ = 0 时,方程有两个相等的实数根;
③ 当 ▲ < 0 时,方程无实数根,但有2个共轭复根。

  1. #include <stdio.h>
  2. #include <math.h>
  3. double P,Q,K,X; //定义全局变量并声明函数
  4. void d0();
  5. void d1();
  6. void d2();
  7. int main()
  8. {
  9. double a,b,c;
  10. scanf("%lf %lf %lf",&a,&b,&c);
  11. P = b*b - 4*a*c; // ▲
  12. Q = (-b) / (2*a);
  13. K = 2*a;
  14. X = sqrt(fabs(P))/K;
  15. if(P<0) // ▲< 0 无实数根,2个共轭复根
  16. {
  17. d0();
  18. }
  19. if(P==0) // ▲ = 0 时,方程有两个相等的实数根
  20. {
  21. d1();
  22. }
  23. if(P>0) // ▲ > 0 时,方程有两个不相等的实数根
  24. {
  25. d2();
  26. }
  27. return 0;
  28. }
  29. void d0(void)
  30. {
  31. printf("x1=%.3lf+%.3lfi x2=%.3lf-%.3lfi",Q,X,Q,X);
  32. }
  33. void d1(void)
  34. {
  35. printf("x1=%.3lf x2=%.3lf",Q+X,Q+X);
  36. }
  37. void d2(void)
  38. {
  39. printf("x1=%.3lf x2=%.3lf",Q+X,Q-X);
  40. }

备注:
将求根公式分开来计算,化繁为简

点赞(0)
 

8.6 分

49 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 15 条评论

奋斗的嘉 2年前 回复TA
看完我的你就知道多定义几个变量的重要性了(
#include<stdio.h>
#include<math.h>
int main()
{
 int a,b,c;
 double d;
 scanf("%d%d%d",&a,&b,&c);
 if(b*b-4*a*c>0){
     printf("x1=%.3lf x2=%.3lf",-1*b/2.0/a+sqrt(b*b-4*a*c)/2.0/a,-1*b/2.0/a-sqrt(b*b-4*a*c)/2.0/a);
 }
 else if(b*b-4*a*c==0){
 	printf("x1=%.3lf x2=%.3lf",-1*b/2.0/a,-1*b/2.0/a);
 	
 }
 else {
 	printf("x1=%.3lf+%.3lfi x2=%.3lf-%.3lfi",-1*b/2.0/a,sqrt(fabs(b*b-4*a*c))/2.0/a,-1*b/2.0/a,sqrt(fabs(b*b-4*a*c))/2.0/a);
 }
	
}
oula 2年前 回复TA
void Cal(double num_1 ,double num_2 ,double num_3)
{
    double x_1 = 0 ,x_2 = 0;
    double data = pow(num_2 ,2) - (4 * num_1 * num_3); /*B^2 - 4* A * C*/
    if(data >= 0)
    {
        x_1 = ((-num_2) + sqrt(data)) / (2 * num_1);
        x_2 = ((-num_2) - sqrt(data)) / (2 * num_1);
        printf("x1=%.3lf x2=%.3lf" ,x_1 ,x_1);
    }
    else if(data < 0) /* 复数显示方式需要注意*/
    {
        x_1 = sqrt(fabs(data)) / (2 * num_1);
        x_2 = sqrt(fabs(data)) / (2 * num_1);
        printf("x1=%.3lf+%.3lfi x2=%.3lf-%.3lfi",(-num_2) / (2 * num_1),x_1,(-num_2) / (2 * num_1),x_2);

    }
}
yiguriyue 2年前 回复TA
#include<stdio.h>
#include<math.h>
float arr[2];
float* dayu(int a,int b,int c)
{
	arr[0]=(float)(-b+sqrt(b*b-4*a*c))/(2*a);
	arr[1]=(float)(-b-sqrt(b*b-4*a*c))/(2*a);
	return arr;
}
float* dengyu(int a,int b,int c)
{
	arr[1]=arr[0]=-b/(2*a);
	return arr;
}
float* xiaoyu(int a,int b,int c)
{
	arr[0]=arr[1]=(float)-b/(2*a);
	return arr;
}
int main()
{
	int a,b,c,d;
	scanf("%d%d%d",&a,&b,&c);
	d=b*b-4*a*c;
	if(d>0)
	{
	dayu(a,b,c);
	 printf("x1=%f x2=%f",arr[0],arr[1]);
}
	if(d==0)
	{
	dengyu(a,b,c);
	 printf("x1=%f x2=%f",arr[0],arr[1]);
    }
	if(d<0)
	{
	xiaoyu(a,b,c);
	 printf("x1=%.3f+%.3fi
stolen 2年前 回复TA
@stolen 主函数版本的
stolen 2年前 回复TA
#include<stdio.h>
#include<math.h>
int main(){
	double a,b,c,d,x1,x2,sb;
	scanf("%lf %lf %lf",&a,&b,&c);
	d = b*b-4*a*c;
	sb = sqrt(fabs(d));
	if(d>0){
		x1 = (-b+sb)/2*a;
		x2 = (-b-sb)/2*a;	
		printf("x1=%.3lf,x2=%.3lf",x1,x2);
	}
	else if(d==0){
		x1 = x2 = sb/2*a;
		printf("x1=%.3lf,x2=%.3lf",x1,x2);
	}
	else if(d<0){
		double m,n;
		m=(-b)/(2*a);   //  a+bi  a=-b/2a b=根号-d/2a;
		n=sqrt(-d)/(2*a);
		printf("x1=%.3lf+%.3lfi x2=%.3lf-%.3lfi",m,n,m,n);
	}
	return 0;
}