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语言
#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++;
#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吧?这年头能找到就不易啊……
求一元二次方程的根
描述
利用公式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语言求一元二次方程的根的主要内容,如果未能解决你的问题,请参考以下文章