感想:這道題是基礎題,但是提交後發現在openjudge中只能得到一部分分數,原因就在於少了一句代碼。完整源代碼貼在下面。這句代碼在題目中有對應的一句話,所以審題很重要。
描述
利用公式x1 = (-b + sqrt(b*b-4*a*c))/(2*a), x2 = (-b - sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax2+ bx + c =0的根,其中a不等於0。
輸入
輸入一行,包含三個浮點數a, b, c(它們之間以一個空格分開),分別表示方程ax2 + bx + c =0的係數。
輸出
輸出一行,表示方程的解。
若b2 = 4 * a * c,則兩個實根相等,則輸出形式爲:x1=x2=...。
若b2 > 4 * a * c,則兩個實根不等,則輸出形式爲:x1=...;x2 = ...,其中x1>x2。
若b2 < 4 * a * c,則有兩個虛根,則輸出:x1=實部+虛部i; x2=實部-虛部i,即x1的虛部係數大於等於x2的虛部係數,實部爲0時不可省略。實部 = -b / (2*a), 虛部 = sqrt(4*a*c-b*b) / (2*a)
所有實數部分要求精確到小數點後5位,數字、符號之間沒有空格。
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
float a,b,c;
cin>>a>>b>>c;
float x1,x2;
if(b*b==4*a*c)
printf("x1=x2=%.5f",(-b+sqrt(b*b-4*a*c))/(2*a));
else if(b*b>4*a*c)
printf("x1=%.5f;x2=%.5f",(-b+sqrt(b*b-4*a*c))/(2*a),(-b-sqrt(b*b-4*a*c))/(2*a));
else if(b*b<4*a*c)
{
float x=-b/(2*a);
if(x==-0.00000)x=0;//openjudge中測評是wronganswer只有8分的原因就在於少了這一句
printf("x1=%.5f+%.5fi;x2=%.5f-%.5fi",x,sqrt(4*a*c-b*b)/(2*a),x,sqrt(4*a*c-b*b)/(2*a));
}
return 0;
}