一元の二次方程式を求めます(情報学のオリンピックの1本の通-T 1058)
1648 ワード
【タイトル説明】
一元二次方程式ax^2+bx+c=0の根を求め、ここでaは0に等しくない.結果は小数点以下5桁まで正確であることが要求される.
【入力】
方程式ax^2+bx+c=0の係数を表す3つの浮動小数点数a,b,c(それらの間に1つのスペースで区切られた)を含む行を入力します.
【出力】
方程式の解を表す行を出力します.
2つの実ルートが等しい場合、出力形式は「x 1=x 2=...x 1=x 2=...」である.
2つの実根が等しくなく、根が小さい者の前の原則を満たすと、出力形式は「x 1=...;x 2=...x 1=...;x 2=...」;
実根がなければ「No answer!」と出力します.
すべての出力部は小数点以下5桁まで正確で、数字、記号の間にスペースがありません.
【入力サンプル】
-15.97 19.69 12.02
【出力サンプル】
x1=-0.44781;x2=1.68075
【ソースプログラム】
一元二次方程式ax^2+bx+c=0の根を求め、ここでaは0に等しくない.結果は小数点以下5桁まで正確であることが要求される.
【入力】
方程式ax^2+bx+c=0の係数を表す3つの浮動小数点数a,b,c(それらの間に1つのスペースで区切られた)を含む行を入力します.
【出力】
方程式の解を表す行を出力します.
2つの実ルートが等しい場合、出力形式は「x 1=x 2=...x 1=x 2=...」である.
2つの実根が等しくなく、根が小さい者の前の原則を満たすと、出力形式は「x 1=...;x 2=...x 1=...;x 2=...」;
実根がなければ「No answer!」と出力します.
すべての出力部は小数点以下5桁まで正確で、数字、記号の間にスペースがありません.
【入力サンプル】
-15.97 19.69 12.02
【出力サンプル】
x1=-0.44781;x2=1.68075
【ソースプログラム】
#include
#include
#include
#define precision_1 1e-12// ,
#define precision_2 1e-6// ,
/*
:1bit ,11bit ( ),52bit ( )。
x x=((-1)^S)(1.M)(2^(E-127))
,x 0。
, E 0 M 0 , x 0 ,
S, 0 0 ;
*/
/*
x1 x2 ,precision 。
fabs(x1-x2)<=precision x1 x2 。
, precision
*/
using namespace std;
int main()
{
double a,b,c,x1,x2,delta;
cin>>a>>b>>c;
delta=b*b-4*a*c;//
if(delta<0&&fabs(delta)>precision_1)// , delta<0 ,
printf("No answer!
");
else if(fabs(delta)0, delta≈0
{
x1=-b/(2*a);
if(fabs(x1)0
{
x1=(-b+sqrt(delta))/(2*a);
x2=(-b-sqrt(delta))/(2*a);
if(fabs(x1)