一元二次方程一般式轉(zhuǎn)雙根式的算法

先說思路:

大體思路就是輸入a,b,c,然后把a和c分別編成兩個整數(shù)相乘的形式,比如令mn=a,pq=c,則十字相乘時當(dāng)mq+np=b時,m,n,p,q四個數(shù)是正確的,把它以好看的樣子輸出就可以了。用一個循環(huán)分解a,再嵌一個循環(huán)分解c。

難點在于分解c的循環(huán)的取值范圍應(yīng)該是[-|c|,|c|]且取到0時continue跳過這次循環(huán),因為分解c時會判斷c/p是否為整數(shù),如果是整數(shù)的話說明c可以被p整除,則q=c/p,qp=c,而0不能作為分數(shù)的分母(除數(shù))。為什么取值范圍是[-|c|,|c|]呢?當(dāng)a=1,b=-5,c=-6時,我們希望輸出(x-2)(x-3)=0,-2-3=6=c而此時-2,-3都是負數(shù)。

為什么a的取值范圍是[1,a]呢?因為當(dāng)a<0時,一般會讓a、b、c分別乘上-1,而等式右邊是0,乘-1后不變。所以這樣a就恒為正數(shù)了。

image

再貼代碼(python和C++的):

python:

def method(a, b, c):
    if a < 0:
        a, b, c = -a, -b, -c
        for i in range(1, a + 1):
            if a % i == 0:
                for j in range(-abs(c), abs(c) + 1):
                    if j == 0: 
                       continue
                   if c % j == 0 and i * (c / j) + (a / i) * j == b:
                    k = a / I
                    l = c / j
                    if i == 1:
                        i = ''
                    else:
                        i = int(i)
                    if k == 1:
                        k = ''
                    else:
                        k = int(k)
                    if j > 0:
                        j = '+%d' % j
                    else:
                        j = int(j)
                    if l > 0:
                        i = '+%d' % l
                    else:
                        i = int(l)
                    return "(%sx%s)(%sx%s)=0" % (i, j, k, l)
                    break

a = int(input('請輸入a的值:'))
b = int(input('請輸入b的值:'))
c = int(input('請輸入c的值:'))
print(method(a, b, c))

C++(這里注釋詳細一些,原理都是完全一樣的):

> #include <iostream>
> 
> using namespace std;
> 
> int main() {
> 
>     int a, b, c, m, n;
> 
>     cout << "請輸入a: ";
> 
>     cin >> a;
> 
>     cout << "請輸入b: ";
> 
>     cin >> b;
> 
>     cout << "請輸入c: ";
> 
>     cin >> c;
> 
>     if( a < 0 ){
> 
>         a = -a;
> 
>         b = -b;
> 
>         c = -c;
> 
>     }
> 
>     // i是a分解的兩個整數(shù)相乘的第一個整數(shù),m是另一個整數(shù)
> 
>     for( int i = 1; i < a + 1; i++ ){
> 
>         if( a % i == 0 ){
> 
>             // j是c分解的兩個整數(shù)相乘的第一個整數(shù),n是另一個整數(shù)
> 
>             // 也就是說i*j=a,m*n=c
> 
>             for( int j = -abs(c); j < abs(c) + 1; j++ ){
> 
>                 if( j == 0 ){  //這個是避免j=0,自己想想為什么要加這句話
> 
>                     continue;
> 
>                 }
> 
>                 if( c % j == 0 and i * (c / j) + (a / i) * j == b ){
> 
>                     m = a / I;
> 
>                     n = c / j;
> 
>                     cout << "(";
> 
>                     if( i != 1 ){
> 
>                         cout << i;
> 
>                     }
> 
>                     cout << "x";
> 
>                     if( j > 0 ){
> 
>                         cout << "+";
> 
>                     }
> 
>                     cout << j;
> 
>                     cout << ")(";
> 
>                     if( m != 1 ){
> 
>                         cout << m;
> 
>                     }
> 
>                     cout << "x";
> 
>                     if( n > 0 ){
> 
>                         cout << "+";
> 
>                     }
> 
>                     cout << n;
> 
>                     cout << ")=0" << endl;
> 
>                     break;
> 
>                 }
> 
>             }
> 
>         }
> 
>     }
> 
>     return 0;
> 
> }

最后放幾張算法運行時截的圖:

image
image
image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容