博主的代碼都是景過pta嚴苛的測試的,小夥伴們可放心使用 😄
先上代碼,講解緊隨其後。
該代碼比較長,在代碼後,博主會附上簡化版本,小夥伴們可任意挑選
#include <stdio.h>
#include <math.h>
int main()
{
double a,b,c;
scanf("%lf %lf %lf",&a,&b,&c);
if(a!=0)
{
double dt=b*b-4*a*c;
if(dt>0)
{
printf("%.2lf\n",(-b+sqrt(dt))/(2*a));
printf("%.2lf",(-b-sqrt(dt))/(2*a));
}
else if(dt<0)
{
if(b!=0)
{
double real=-b*1.0/(2*a);
double imag=sqrt(-dt)*1.0/(2*a);
printf("%.2lf%+.2lfi\n",real,imag);
printf("%.2lf%+.2lfi",real,-imag);
}
else
{
double imag=sqrt(-dt)*1.0/(2*a);
printf("%.2lf%+.2lfi\n",0.0,imag);
printf("%.2lf%+.2lfi",0.0,-imag);
}
}
else
{
printf("%.2lf\n",-b*1.0/(2*a));
}
}
else
{
if(b!=0)
{
printf("%.2lf\n",-c*1.0/b);
}else
{
if(0==c) printf("Zero Equation\n");
else printf("Not An Equation\n");
}
}
return 0;
}
思路:利用一元二次函數的dt去解決整個問題,dt爲核心,其他的只需要考慮不同情況,擺式子就可以。
- 當a爲0時,顯然這個方程是一個一元一次方程,所以我們在後面直接將這個情況用else列出來,之後便不需要再去考慮。
- 搞定後我們回到a!=0的情況,我們使用dt判斷方程的跟的不同情況。(這裏博主建議小夥伴們在計算這些浮點類數據時使用double型變量,它比float在保證精度方面更強大)
- 若dt大於零,則爲最普通的情況直接計算輸出,若是等於零則只有一個實數根,在dt<0的後面用一個else連接,不需要多講,而我們的重點在於dt小於零。
- 如果dt小於零,則他沒有實根,因此我們需要計算它的複數跟,注意實際上覆數跟與實數根計算差別並不大,我們只需要將根號下的dt加一個負號便好,如果我們只要按着上面計算實根相同情況的式子,接着在根號下加一個負號便可
- 當b!=0的時候,他的虛根是有實部的,因此這裏又需要分開情況
- 這裏輸出感覺花裏胡哨實際上是爲了應付pta這個"糞"系統。🐶
代碼簡化版:
#include <stdio.h>
#include <math.h>
int main()
{
double a,b,c;
scanf("%lf %lf %lf",&a,&b,&c);
if(a!=0)
{
double dt=b*b-4*a*c;
if(dt>0)
printf("%.2lf\n%.2lf",(-b+sqrt(dt))/(2*a),(-b-sqrt(dt))/(2*a));
else if(dt<0)
{
if(b!=0)
printf("%.2lf%+.2lfi\n%.2lf%+.2lfi",-b*1.0/(2*a),sqrt(-dt)*1.0/(2*a),-b*1.0/(2*a),-sqrt(-dt)*1.0/(2*a));
else
printf("%.2lf%+.2lfi\n%.2lf%+.2lfi",0.0,sqrt(-dt)*1.0/(2*a),0.0,-sqrt(-dt)*1.0/(2*a));
}
else
printf("%.2lf\n",-b*1.0/(2*a));
}
else
{
if(b!=0)
printf("%.2lf\n",-c*1.0/b);
else
{
if(0==c) printf("Zero Equation\n");
else printf("Not An Equation\n");
}
}
return 0;
}