/*======================================================================
求一元二次方程的根
总时间限制: 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的情形,此时,需要把负号去掉
========================================================================*/
 #include<stdio.h>
#include<math.h>
int comparToZero(double x);//当x与0之差的绝对值小于0.00001(即:1e-5)时 认为x等于0
int main()
{
int n,i;
double a,b,c,delt;
double x1,x2,real,image;
freopen("222.in","r",stdin);
scanf("%d",&n);
for(i=;i<n;i++)
{
scanf("%lf%lf%lf",&a,&b,&c);
delt=b*b-*a*c;
if(comparToZero(delt)==) //if(delt>0)
{
x1=(-b+sqrt(delt))//a;
x2=(-b-sqrt(delt))//a;
if(comparToZero(x1)==)
x1=;
if(comparToZero(x2)==)
x2=;
printf("x1=%.5lf;x2=%.5lf\n",x1,x2);
}
else if(comparToZero(delt)==) //if(delt==0)
{
x1=-b//a;
if(comparToZero(x1)==)
x1=;
printf("x1=x2=%.5lf\n",x1);
}
else //delt<0
{
delt=sqrt(-delt);
real=-b//a;
image=delt//a;
if(comparToZero(real)==) real=;
if(comparToZero(image)==) image==;
printf("x1=%.5lf+%.5lfi;x2=%.5lf-%.5lfi\n",real,image,real,image);
}
}
return ;
}
int comparToZero(double x)//当x与0之差的绝对值小于0.00001(即:1e-5)时 认为x等于0
{
/*if(x>0) return 1;
else if(x<0) return -1;
else return 0;*/
//上面的写法会出现浮点数计算精度的误差 。需要改用下面的方法来比较浮点数x和0之间的大小关系。
if((x-)>1e-) return ;
else if((x-)<-(1e-)) return -;
else return ;
}
/*==============================================================================
实数运算中,经常需要判断实数x和y是否相等。编程者往往把判断的条件简单设成x==y或者y-x==0.
实际上,这种写法是有失偏颇的,可能会产生精度误差。
避免精度误差的办法就是设置一个精度常量delta。
若y-x的实数值与0之间的区间长度小于delta,则认为x和y相等,这样就可以把误差控制在delta范围内。
显然,判断实数x和y是否相等的条件应设成|x-y|<=delta。下面是一个实例。
===============================================================================*/

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

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

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

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

  1. 计算概论(A)/基础编程练习1(8题)/4:求一元二次方程的根

    #include<stdio.h> #include<math.h> int main() { // 待解方程数目 int n; scanf("%d", & ...

  2. Openjudge-计算概论(A)-求一元二次方程的根

    描述: 利用公式x1 = (-b + sqrt(b*b-4*a*c))/(2*a), x2 = (-b - sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax2 + bx + c =0的根 ...

  3. ocrosoft 1015 习题1.22 求一元二次方程a*x^2 + b*x + c = 0的根

    http://acm.ocrosoft.com/problem.php?id=1015 题目描述 求一元二次方程a*x2 + b*x + c = 0的根.系数a.b.c为浮点数,其值在运行时由键盘输入 ...

  4. 基于linux或windows的c/s的循环服务器求一元二次方程的根

    在linux和windows上实现 c/s模式 socket循环服务器求解一元二次方程的根 ax^2+bx+c=0 根据上式,客户端发送a,b,c给服务器,返回求解的根 暂未考虑非法数据等问题 lin ...

  5. C++分支结构,求一元二次方程的根

    总时间限制:  1000ms 内存限制:  65536kB 描述 利用公式x1 = (-b + sqrt(b*b-4*a*c))/(2*a), x2 = (-b - sqrt(b*b-4*a*c))/ ...

  6. 用c#求一元二次方程

    题目:编一个程序,输入a .b.c 的值,求出一元二次方程a*x*x+b*x+c=0的二个实数根. 我的思路: 我们都知道数学中求一元二次方程有很多方法:直接开方法.配方法.公式法.分解因式法等等,在 ...

  7. 【Python实践-1】求一元二次方程的两个解

    知识点: import sys, sys模块包含了与Python解释器和它的环境有关的函数. “sys”是“system”的缩写.sys.exit() 中途退出程序, (注:0是正常退出,其他为不正常 ...

  8. Python编写“求一元二次方程的解”

    #求一元二次方程的解 import math def equation(a,b,c): h=b*b-4*a*c #一元二次方程的解,百度来的 if h>=0: x1=(-b+math.sqrt( ...

  9. 1205: 求一元二次方程的实数根(C)

    一.题目 acm.wust.edu.cn/problem.php?id=1205&soj=0 二.分析 一元二次方程有三个系数a.b.c,两个根x1.x2,以及d(德尔塔): a.b.c均为实 ...

随机推荐

  1. swift 闭包+嵌套函数+extension+单例+嵌套函数+??

    //: Playground - noun: a place where people can play import UIKit //*******************嵌套函数********* ...

  2. 后台代码对iBatis配置文件中具体的sql语句的调用实现(被封装的增删改查)

    using IBatisNet.Common.Exceptions; using IBatisNet.DataAccess; using IBatisNet.DataAccess.DaoSession ...

  3. 小P的图论课 (模拟退火)

    uses math; ; INF=; var n,m,i,x,y,sum,ans,delta:longint; map:..maxn,..maxn] of longint; flag:..maxn] ...

  4. C#使用指针复制字节数组

    下面的示例使用指针将字节从一个数组复制到另一个数组. 此示例使用 unsafe 关键字,它使您能够在 Copy 方法中使用指针. fixed 语句用于声明指向源数组和目标数组的指针. 这将锁定源数组和 ...

  5. HDU 4462

    http://acm.hdu.edu.cn/showproblem.php?pid=4462 一道题意不清的水题 题意:给一个n*n的格子,在上面放草人,每个草人有恐惧范围,问最少选择几个草人可以覆盖 ...

  6. css中解决img在a元素中使得a元素撑大写法

    给外面a标签padding-left:; img自身float:left;margin-left:; 这种写法避免了不少因浮动产生的问题,且代码简明,推荐适当的使用此方法.

  7. xmind的第三天笔记

  8. CSS基础知识点(二)——选择器

    在这一篇中,主要总结一下CSS中的选择器. 参考:http://www.cnblogs.com/webblog/archive/2009/07/07/1518274.html CSS中的选择器主要包括 ...

  9. 单元测试--四则运算2程序(c++)

    源代码: //2016 3.6 Cheng Qiqin //四则运算改进 #include <iostream> #include<ctime> #include<cst ...

  10. bootstrap-3

    段落: 1.全局文本字号为14px(font-size); 2.行高为1.42857143(line-height),大约是20px(一串数字是由less编译器计算出来的,当然sass也有这样的功能) ...