c语言求一元二次方程的根

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言求一元二次方程的根相关的知识,希望对你有一定的参考价值。

题目描述
一元二次方程的标准形式为ax2+bx+c=0(a≠0),其中a、b、c为常数。求解一元二次方程的根x时有三种情况,分别为(记Δ=b2-4ac):
1. Δ>0,有两个不等的实根;
2. Δ=0,有两个相同的实根;
3. Δ<0,有两个共轭的虚根。

输入
输入为多行,每行为一元二次方程的三个常数a,b,c,在double类型范围之内。当输入的a为0时,表示输入结束。

输出
每行输入的样例对应三行输出。

第一行输出为样例的编号。第二行输出为所输入常数a,b,c对应的一元二次方程的标准形式,要求输出满足a>0。第三行输出为所输入方程的根,分为三种情况:1. 若方程满足Δ>0,即有两不等实根x1、x2,则按大小顺序输出这两个实根。2. 若方程满足Δ=0,即有两相同实根x,则输出一个实根。3. 若方程满足Δ<0,即有两共轭的虚根x1、x2,则输出两个虚根,虚部符号为正的(即u+vi形式)先输出,虚部符号为负的(x-yi形式)后输出。

以上输出均不输出数学上无意义或可省略的的符号,所有数值最多保留6位有效数字。每个样例之后都有一个空行分隔。

样例输入
1 2 1
-1 2 -1
-5 2 -0.2
-3 2 0
3 0 12
2 4 4
0
样例输出
Case 1 :
x^2 + 2x + 1 = 0
only one real root : -1

Case 2 :
x^2 - 2x + 1 = 0
only one real root : 1

Case 3 :
5x^2 - 2x + 0.2 = 0
only one real root : 0.2

Case 4 :
3x^2 - 2x = 0
two real roots : 0, 0.666667

Case 5 :
3x^2 + 12 = 0
two imaginary roots : 2i, -2i

Case 6 :
2x^2 + 4x + 4 = 0
two imaginary roots : -1+i, -1-i

提示

输出方程格式的各种情况要想清楚,这一部分测试数据给的很全面。另一个就是浮点数的精度控制,这一部分sample给出了例子。

#include <iostream> 

#include <cmath>

using namespace std; 

int main()

float a,b,c;float x1,x2; cin>a>>b>>c;float dlt=b*b-4*a*c;if(dlt>=0)x1=-b/2/a+sqrt(dlt)。

/2/ax2=-b/2/a-sqrt(dlt)/2/a。

cout<<a<<"x^2+"<<b<<"x+"<<c<<"=0有两个实根:";cout<<"x1="<<x1<<",x2="<<x2<<endl; 

else

 x1=-b/2/a;x2=sqrt(-dlt)/2/a;cout<<a<<"x^2+"<<b<<"x+"<<c<<"=0有两个虚根:"。

cout<<"x="<<x1<<"+/-"<<x2<<"i"<<endl;

return 0。

扩展资料:

成立条件:

一元二次方程成立必须同时满足三个条件:

①是整式方程,即等号两边都是整式,方程中如果有分母;且未知数在分母上,那么这个方程就是分式方程,不是一元二次方程,方程中如果有根号,且未知数在根号内,那么这个方程也不是一元二次方程(是无理方程)。

②只含有一个未知数;

③未知数项的最高次数是2。

参考资料来源:百度百科-c语言





参考技术A #include <stdio.h>
#include <math.h>
int f(int a,int b,int c)

float d;
d=b*b-4*a*c;
if(d>0)
printf("有两个不等的实根,分别为%f,%f\n ",(-b+sqrt(d))/2.0,(-b-sqrt(d))/2.0);
else if(d==0)
printf("有两个相同的实根,为%f\n",-b/2.0);
else
printf("有两个共轭的虚根,分别为%f,%f\n ",(-b+sqrt(-d))/2.0,(-b-sqrt(-d))/2.0);

main()

int a[100],b[100],c[100];
int i,j,k;
for(i=0;;i++)

printf("Input the %d :\n",i+1);
scanf("%d %d %d",&a[i],&b[i],&c[i]);
if(a[i]==0)
break;
j=i;

for(i=0;i<=j;i++)

printf("the %d\n:",i+1);
f(a[i],b[i],c[i]);

参考技术B #include<iostream>
#include<string>
#include<fstream>
#include <cmath>
using namespace std;

void main(void)

double a,b,c;
double delta;
int count=1;

cin>>a;
while(a!=0)

cin>>b>>c;

cout<<"Case "<<count<<':'<<endl;
if(a<0)

a=-a;b=-b;c=-c;

if(a==1) cout<<"x^2 ";
else cout<<a<<"x^2 ";
if(b>0)

if(b==1) cout<<"+ x ";
else cout<<"+ "<<b<<"x ";

else if(b<0)

if(b==-1) cout<<"- x ";
else cout<<"- "<<-b<<"x ";

if(c>0)
cout<<"+ "<<c<<' ';
else if(c<0)
cout<<"- "<<-c<<' ';
cout<<"= 0"<<endl;

delta=b*b-4*a*c;
if(delta==0)

cout<<"only one real root : "<<-b/2/a<<endl;

else if(delta>0)

cout<<"two real roots : "<<(-b-sqrt(delta))/2/a<<','<<(-b+sqrt(delta))/2/a<<endl;

else

if(b!=0)
cout<<"two imaginary roots : "<<-b/2/a<<'+'<<sqrt(-delta)/2/a<<"i,"<<-b/2/a<<'-'<<sqrt(-delta)/2/a<<'i'<<endl;
else
cout<<"two imaginary roots : "<<sqrt(-delta)/2/a<<"i,-"<<sqrt(-delta)/2/a<<'i'<<endl;

cout<<endl;

cin>>a;
count++;

追问

--------------------Configuration: 11 - Win32 Debug--------------------
Compiling...
q.c
g:\常用软件\vc98\include\eh.h(32) : fatal error C1189: #error : "eh.h is only for C++!"
执行 cl.exe 时出错.

11.exe - 1 error(s), 0 warning(s)

用c语言啊~~

追答

#include
#include
#include

void main(void)

double a,b,c;
double delta;
int count=1;

scanf("%lf",&a);
while(a!=0)

scanf("%lf%lf",&b,&c);

printf("Case %d:",count);
if(a0)

if(b==1) printf("+ x ");
else printf("+ %gx ",b);

else if(b0)
printf("+ %g ",c);
else if(c0)

printf("two real roots : %g,%g\n",(-b-sqrt(delta))/2/a,(-b+sqrt(delta))/2/a);

else

if(b!=0)

if(fabs(sqrt(-delta)/2/a-1)<=1e-6)
printf("two imaginary roots : %g+i,%g-i\n",-b/2/a,-b/2/a);
else
printf("two imaginary roots : %g+%gi,%g-%gi\n",-b/2/a,sqrt(-delta)/2/a,-b/2/a,sqrt(-delta)/2/a);

else
printf("two imaginary roots : %gi,-%gi\n",sqrt(-delta)/2/a,sqrt(-delta)/2/a);

printf("\n");

scanf("%lf",&a);
count++;

参考技术C #include <stdio.h>
#include <string.h>
#include <math.h>
#include <float.h>

void calculate(double a,double b,double c)

double delta;

if(a<0)

a=-a;
b=-b;
c=-c;


a==1?printf("x^2"):printf("%gx^2",a);
if(b>0)
b==1?printf("+x"):printf("+%gx",b);
if(b<0)
b==-1?printf("-x"):printf("%gx",b);
if(c>0)
printf("+%g",c);
if(c<0)
printf("%g",c);
puts("=0");

delta=b*b-4*a*c;
if(fabs(delta) < FLT_EPSILON)
printf("only one real root :%.6g\n",-b/2/a);
else if(delta>0)
printf("two real roots :%.6g,%.6g\n",(-b-sqrt(delta))/2/a,(-b+sqrt(delta))/2/a);
else if(delta<0)

if(b)

if(sqrt(-delta)/2/a!=1)

printf("two imaginary roots :%g+%gi,%g-%gi\n",
-b/2/a,
sqrt(-delta)/2/a,
-b/2/a,
sqrt(-delta)/2/a);

else

printf("two imaginary roots :%g+i,%g-i\n",
-b/2/a,
-b/2/a);


else

if(sqrt(-delta)/2/a!=1)

printf("two imaginary roots : %gi,-%gi\n",
sqrt(-delta)/2/a,
sqrt(-delta)/2/a);

else
puts("two imaginary roots : i,-i");


puts("");


int main ()

double a[100];
double b[100];
double c[100];
char str[80];
int n=0;
int i;

puts("Input:");
while(true)

gets(str);
if(!strcmp(str,"0"))
break;
sscanf(str,"%lf %lf %lf",
&a[n],
&b[n],
&c[n]);
n++;


for(i=0;i<n;i++)

printf("Case %d:\n",i+1);
calculate(a[i],b[i],c[i]);

追问

Compiling...
j.c
g:\常用软件\vc\msdev98\myprojects\发v\j.c(77) : error C2065: 'true' : undeclared identifier
执行 cl.exe 时出错.

发v.exe - 1 error(s), 0 warning(s)

有错误,,调试一下啦

追答

我勒个去,什么鬼编译器?连true都不认识?
#include
#include
#include
#include

void calculate(double a,double b,double c)

double delta;

if(a0)
b==1?printf("+x"):printf("+%gx",b);
if(b0)
printf("+%g",c);
if(c0)
printf("two real roots :%.6g,%.6g\n",(-b-sqrt(delta))/2/a,(-b+sqrt(delta))/2/a);
else if(delta<0)

if(b)

if(sqrt(-delta)/2/a!=1)

printf("two imaginary roots :%g+%gi,%g-%gi\n",
-b/2/a,
sqrt(-delta)/2/a,
-b/2/a,
sqrt(-delta)/2/a);

else

printf("two imaginary roots :%g+i,%g-i\n",
-b/2/a,
-b/2/a);


else

if(sqrt(-delta)/2/a!=1)

printf("two imaginary roots : %gi,-%gi\n",
sqrt(-delta)/2/a,
sqrt(-delta)/2/a);

else
puts("two imaginary roots : i,-i");


puts("");


int main ()

double a[100];
double b[100];
double c[100];
char str[80];
int n=0;
int i;

puts("Input:");
while(1)

gets(str);
if(!strcmp(str,"0"))
break;
sscanf(str,"%lf %lf %lf",
&a[n],
&b[n],
&c[n]);
n++;


for(i=0;i<n;i++)

printf("Case %d:\n",i+1);
calculate(a[i],b[i],c[i]);



你用的不会是传说中的6.0吧?这年头能找到就不易啊……

参考技术D 分太少

求一元二次方程的根

描述

利用公式x1 = (-b + sqrt(b*b-4*a*c))/(2*a), x2 = (-b - sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax2+ bx + c =0的根,其中a不等于0。

输入输入一行,包含三个浮点数a, b, c(它们之间以一个空格分开),分别表示方程ax2 + bx + c =0的系数。输出输出一行,表示方程的解。
若b2 = 4 * a * c,则两个实根相等,则输出形式为:x1=x2=...。
若b2 > 4 * a * c,则两个实根不等,则输出形式为:x1=...;x2 = ...,其中x1>x2。
若b2 < 4 * a * c,则有两个虚根,则输出:x1=实部+虚部i; x2=实部-虚部i,即x1的虚部系数大于等于x2的虚部系数,实部为0时不可省略。实部 = -b / (2*a), 虚部 = sqrt(4*a*c-b*b) / (2*a)

所有实数部分要求精确到小数点后5位,数字、符号之间没有空格。样例输入

样例输入1
1.0 2.0 8.0

样例输入2
1 0 1

样例输出

样例输出1
x1=-1.00000+2.64575i;x2=-1.00000-2.64575i

样例输出2
x1=0.00000+1.00000i;x2=0.00000-1.00000i

来源1709

用 double ,不要用float,float精度可能不够

源代码:

#include<stdio.h>
#include<math.h>
int main()
{
double a,b,c,d,x1,x2,q,p;
scanf("%lf %lf %lf",&a,&b,&c);
if(a<0)
a=-a;
d=b*b-4*a*c;
q=-b/(2.0*a);
p=sqrt(d)/(2.0*a);
x1=q+p;
x2=q-p;
if(b*b-4*a*c==0)
printf("x1=x2=%.5f\n",x1);
else
if(b*b-4*a*c>0)
{
if(x1>x2)
printf("x1=%.5f;x2=%.5f\n", x1, x2);
else
printf("x2=%.5f;x1=%.5f\n", x2, x1);
}
else
{
if(b*b-4*a*c<0)
d=4*a*c-b*b;
q=-b/(2.0*a);
p=sqrt(d)/(2.0*a);
{
if(q==0)
printf("x1=%.5f+%.5fi;x2=%.5f-%.5fi\n",-q,p,-q,p);
else
printf("x1=%.5f+%.5fi;x2=%.5f-%.5fi\n",q,p,q,p);
}
}
return 0;
}

以上是关于c语言求一元二次方程的根的主要内容,如果未能解决你的问题,请参考以下文章

c语言求一元二次方程的根

C语言 求一元二次方程的根 openjudge

用c语言求一个四元二次方程解的个数

C语言编程:求1元2次方程的根

c语言解一元二次方程

用C语言编写程序,输入一元二次方程的系数a,b,c,计算方程的根,要考虑虚根的情况,求解答