【坑題】一元二次方程
阿新 • • 發佈:2020-08-28
題目描述
小籠包在寫數學作業,練習冊上有一道一元二次方程求解。題目給定了一個形如 Ax2+Bx+C=0 的方程,並且給出了A,B,C的值。
小籠包實在不會,於是他便請求你幫他寫這題。作為回報,小籠包會請你吃小籠包。
輸入格式
第一行輸入三個整數A,B,C,表示方程的係數。
(−105<=A,B,C<=105)
輸出格式
有無窮多解輸出-1。
找不到任何一個值使得等式成立,輸出0。
有實數解:第一行解的數量,接下來的若干行,每行一個實數解,升序排列,保留後6位。
樣例輸入
1 1 -2
樣例輸出
2
-2.000000
1.000000
說點啥
這道題看上去很簡單,但是真的難爆了!!!要是不能因為能通過看沒通過的測試點不斷改錯,撓禿頂了你也想不到你錯在哪裡!簡直自閉到爆,浮點型別運算竟然會得到-0.000000的結果,我的天啊,竟然會會考這種小特性,必須加上一句if(fabs(x)<1e-9)x=fabs(x)。可怕!
Code
#include<iostream> #include<stdio.h> #include<math.h> using namespace std; double d,a,b,c,ans1,ans2; int main() { cin>>a>>b>>c; d=b*b-4*a*c; if(a==0) { if(b==0&&c==0)cout<<"-1"<<endl; else if(b==0&&c!=0)cout<<0<<endl; else if(fabs(-c/b)<1e-9) cout<<1<<endl<<"0.000000"<<endl; else printf( "1\n%.6f\n",-c/b ); } else { if(d<0) cout<<0<<endl; else if(d==0) { ans1=-b/(2*a); if(fabs(ans1)<1e-9)ans1=fabs(ans1); printf( "1\n%.6f\n",ans1 ); } else if(d>0) { ans1=(-sqrt(d)-b)/(2*a); ans2=(sqrt(d)-b)/(2*a); if(fabs(ans1)<1e-9)ans1=fabs(ans1); if(fabs(ans2)<1e-9)ans2=fabs(ans2); if(ans1>ans2)swap(ans1,ans2); printf( "2\n%.6f\n",ans1); printf( "%.6f\n",ans2); } } return 0; }