7-2一元二次方程式の根を求める

12045 ワード

本テーマは一元二次方程式の根を要求し,結果は2桁の小数を保持する.
入力形式:
入力は1行に3つの浮動小数点係数a,b,cを与え,中間をスペースで区切る.
出力フォーマット:
係数の場合、異なる結果を出力する:1)方程式に2つの等しくない実数のルートがある場合、行ごとに1つのルートを出力し、先に大きくなってから小さくなる.2)方程式に2つの等しくない複数のルートがある場合、各行はフォーマット「実部+虚部i」に従って1つのルートを出力し、先に虚部を正に出力し、後に虚部を負に出力する.3)方程式が1本しかない場合、このルートを直接出力します.4)係数が全て0の場合、「Zero Equation」を出力する.5)aとbが0,cが0でない場合は「Not An Equation」を出力する.
入力サンプル1:
2.1 8.9 3.5
出力サンプル1:
-0.44 -3.80
入力サンプル2:
1 2 3
出力サンプル2:
-1.00+1.41i -1.00-1.41i
入力サンプル3:
0 2 4
出力サンプル3:
-2.00
入力サンプル4:
0 0 0
出力サンプル4:
Zero Equation
入力サンプル5:
0 0 1
出力サンプル5:
Not An Equation
問題を解いて感じます
この問題は難しくありませんが、delta/(2*a)ここではカッコが必要で、多くの場所でこのカッコを漏らすことができません.また、最後のテストポイントは無視されやすいので、-0が現れない場合を考慮して分類して議論します.
#include
#include 
#include
using namespace std;
void swap(double a,double b)
{
 double *m=&a,*n=&b,k;
 k=*m;
 *m=*n;
 *n=k;
}
int main()
{
 double a,b,c,x1,x2,p,q,delta;
 cin>>a>>b>>c;
 delta=b*b-4*a*c;
 if(a==0)
 {
  if(b==0)
  {
   if(c==0)    cout<<"Zero Equation";
   else    cout<<"Not An Equation";
  }
  else    cout<<fixed<<setprecision(2)<<(-c)/b<<endl;
 }
 else
 {
  x1=(-b+sqrt(delta))/(2*a);
  x2=(-b-sqrt(delta))/(2*a);
  if(delta>0)
  {
   if(x2>x1)   swap(x1,x2);
   cout<<fixed<<setprecision(2)<<x1<<endl<<fixed<<setprecision(2)<<x2<<endl;
  }
  if(delta==0)    cout<<fixed<<setprecision(2)<<x1<<endl;
  if(delta<0)
  {
   delta*=-1;
   if(b)   p=(-b)/(2*a);//         b 0     -0   
   else    p=b/(2*a);
   q=sqrt(delta)/(2*a);
   cout<<fixed<<setprecision(2)<<p<<'+'<<fixed<<setprecision(2)<<q<<'i'<<endl;
   cout<<fixed<<setprecision(2)<<p<<'-'<<fixed<<setprecision(2)<<q<<'i'<<endl;
  }
 }
}