PTA 7-6 求一元二次方程的根 (14分)

博主的代碼都是景過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爲核心,其他的只需要考慮不同情況,擺式子就可以。

  1. 當a爲0時,顯然這個方程是一個一元一次方程,所以我們在後面直接將這個情況用else列出來,之後便不需要再去考慮。
  2. 搞定後我們回到a!=0的情況,我們使用dt判斷方程的跟的不同情況。(這裏博主建議小夥伴們在計算這些浮點類數據時使用double型變量,它比float在保證精度方面更強大)
  3. 若dt大於零,則爲最普通的情況直接計算輸出,若是等於零則只有一個實數根,在dt<0的後面用一個else連接,不需要多講,而我們的重點在於dt小於零。
  4. 如果dt小於零,則他沒有實根,因此我們需要計算它的複數跟,注意實際上覆數跟與實數根計算差別並不大,我們只需要將根號下的dt加一個負號便好,如果我們只要按着上面計算實根相同情況的式子,接着在根號下加一個負號便可
  5. 當b!=0的時候,他的虛根是有實部的,因此這裏又需要分開情況
  6. 這裏輸出感覺花裏胡哨實際上是爲了應付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;
}

over

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章