OpenJudge计算概论-求一元二次方程的根【含复数根的计算、浮点数与0的大小比较】

简介: /*====================================================================== 求一元二次方程的根 总时间限制: 1000ms 内存限制: 65536kB 描述 利用公式x1 = (-b + sqrt(b*b-4*a*c))/(2*a), x2 = (-b - sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax^2 + bx + c =0的根,其中a不等于0。
/*======================================================================
求一元二次方程的根
总时间限制: 1000ms 内存限制: 65536kB
描述
利用公式x1 = (-b + sqrt(b*b-4*a*c))/(2*a), x2 = (-b - sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax^2 + bx + c =0的根,其中a不等于0。
输入
第一行是待解方程的数目n。 
其余n行每行含三个浮点数a, b, c(它们之间用空格隔开),分别表示方程ax2 + bx + c =0的系数。
输出
输出共有n行,每行是一个方程的根:
若是两个实根,则输出:x1=...;x2 = ...
若两个实根相等,则输出:x1=x2=...
若是两个虚根,则输出:x1=实部+虚部i; x2=实部-虚部i

所有实数部分要求精确到小数点后5位,数字、符号之间没有空格。
x1和x2的顺序:x1的实部>x2的实部||(x1的实部==x2的实部&&x1的虚部>=x2的虚部)
样例输入
3
1.0 3.0 1.0
2.0 -4.0 2.0
1.0 2.0 8.0
样例输出
x1=-0.38197;x2=-2.61803
x1=x2=1.00000
x1=-1.00000+2.64575i;x2=-1.00000-2.64575i
提示
1、需要严格按照题目描述的顺序求解x1、x2。
2、方程的根以及其它中间变量用double类型变量表示。
3、函数sqrt()在头文件math.h中。
4、要输出浮点数、双精度数小数点后5位数字,可以用下面这种形式: 

printf("%.5f", num);

注意,在使用Java做此题时,可能会出现x1或x2等于-0的情形,此时,需要把负号去掉
========================================================================*/
 1 #include<stdio.h>
 2 #include<math.h>
 3 int comparToZero(double x);//当x与0之差的绝对值小于0.00001(即:1e-5)时 认为x等于0 
 4 int main()
 5 {
 6     int n,i;
 7     double a,b,c,delt;
 8     double x1,x2,real,image;
 9     freopen("222.in","r",stdin);
10     scanf("%d",&n);
11     for(i=0;i<n;i++)
12     {
13         scanf("%lf%lf%lf",&a,&b,&c);
14         delt=b*b-4*a*c;
15         if(comparToZero(delt)==1)   //if(delt>0)
16         {
17             x1=(-b+sqrt(delt))/2/a;
18             x2=(-b-sqrt(delt))/2/a;
19             if(comparToZero(x1)==0)
20                 x1=0;
21             if(comparToZero(x2)==0)
22                 x2=0;
23             printf("x1=%.5lf;x2=%.5lf\n",x1,x2);
24         }
25         else if(comparToZero(delt)==0)   //if(delt==0)
26         {
27             x1=-b/2/a;
28             if(comparToZero(x1)==0)
29                 x1=0;
30             printf("x1=x2=%.5lf\n",x1);
31         }
32         else   //delt<0
33         {
34             delt=sqrt(-delt);
35             real=-b/2/a;
36             image=delt/2/a;
37             if(comparToZero(real)==0) real=0;
38             if(comparToZero(image)==0) image==0;
39             printf("x1=%.5lf+%.5lfi;x2=%.5lf-%.5lfi\n",real,image,real,image);
40         }
41     }
42     return 0;
43 }
44 int comparToZero(double x)//当x与0之差的绝对值小于0.00001(即:1e-5)时 认为x等于0 
45 {
46     /*if(x>0)  return 1;
47     else if(x<0)  return -1;
48     else  return 0;*/  
49     //上面的写法会出现浮点数计算精度的误差 。需要改用下面的方法来比较浮点数x和0之间的大小关系。 
50     if((x-0)>1e-5) return 1;
51     else if((x-0)<-(1e-5)) return -1;
52     else return 0;
53 }
54 /*==============================================================================
55 实数运算中,经常需要判断实数x和y是否相等。编程者往往把判断的条件简单设成x==y或者y-x==0.
56 实际上,这种写法是有失偏颇的,可能会产生精度误差。
57 避免精度误差的办法就是设置一个精度常量delta。
58 若y-x的实数值与0之间的区间长度小于delta,则认为x和y相等,这样就可以把误差控制在delta范围内。
59 显然,判断实数x和y是否相等的条件应设成|x-y|<=delta。下面是一个实例。
60 ===============================================================================*/

 

这个题目需要注意的两个地方:

/*==========================================
这个题需要注意的地方:
1. 当一个数如果在(-0.000005,0)之间,输出精确到小数点后5位,
就是0而不是期望的某个小数0.00……,所以需要判断处理一下输出数据

2. 浮点数无法和0比较,浮点数本身不是一个精确值,
可以用fabs(x-0)<1e-5来比较(这里精确度为5)
============================================*/

 

 

 

 

 

 

 

 

相关文章
|
存储 算法 Python
【Python 百练成钢】高精度加法、阶乘计算、矩阵幂运算、矩阵面积交
【Python 百练成钢】高精度加法、阶乘计算、矩阵幂运算、矩阵面积交
162 0
【Python 百练成钢】高精度加法、阶乘计算、矩阵幂运算、矩阵面积交
|
存储 机器学习/深度学习 人工智能
【Python 百练成钢】DNA、蛇形矩阵、Huffuman树、K-进制数、K倍区间、交换瓶子、第几个幸运数、四平方和、The 3n + 1 problem、大数乘法
【Python 百练成钢】DNA、蛇形矩阵、Huffuman树、K-进制数、K倍区间、交换瓶子、第几个幸运数、四平方和、The 3n + 1 problem、大数乘法
241 0
【Python 百练成钢】DNA、蛇形矩阵、Huffuman树、K-进制数、K倍区间、交换瓶子、第几个幸运数、四平方和、The 3n + 1 problem、大数乘法
|
C语言
浙大版《C语言程序设计(第3版)》题目集 - 习题9-3 平面向量加法(15 分)
浙大版《C语言程序设计(第3版)》题目集 - 习题9-3 平面向量加法(15 分)
108 0
|
监控 JavaScript 程序员
《编程珠玑(续)(修订版)》—第1章1.1节计算素数
听诊器是一种简单工具,却给医生的工作带来了革命:它让内科医生能有效地监控病人的身体。性能监视工具(profiler)对程序起着同样的作用。
1508 0
|
机器学习/深度学习 人工智能
OpenJudge计算概论-矩阵归零消减序列和
矩阵归零消减序列和 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个n*n的矩阵(3 1;x--) 24 { 25 //行的归零 26 for(i=0;i
1065 0
|
存储 人工智能 算法
Openjudge计算概论-求序列中的众数
/*===================================== 求序列中的众数 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个长度为N的整数序列 (不多于128个整数),每个整数的范围在[-10^52,10^52],计算这个序列的众数。
1008 0
|
人工智能
Openjudge计算概论-奇数单增序列
/*===================================== 奇数单增序列 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按增序输出。
1098 0
|
人工智能
OpenJudge计算概论-计算鞍点
/*======================================================================== 计算鞍点 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个二维 (5*5)数组,每行只有一个最大值,每列只有一个最小值。
1186 0
|
存储 人工智能
OpenJudge计算概论-找最大数序列
/*===================================== 找最大数序列 总时间限制: 1000ms 内存限制: 65536kB 描述 输入n行(n 不大于 30),每行不超过100个无符号整数,无符号数不超过4位。
1280 0
OpenJudge计算概论-求出e的值
/*======================================================================== 求出e的值 总时间限制: 1000ms 内存限制: 65536kB 描述 利用公式e = 1 + 1/1! + 1/2! + 1/3! + ... + 1/n! 求e 。
873 0