一元二次方程一般式转双根式的算法

先说思路:

大体思路就是输入a,b,c,然后把a和c分别编成两个整数相乘的形式,比如令mn=a,pq=c,则十字相乘时当mq+np=b时,m,n,p,q四个数是正确的,把它以好看的样子输出就可以了。用一个循环分解a,再嵌一个循环分解c。

难点在于分解c的循环的取值范围应该是[-|c|,|c|]且取到0时continue跳过这次循环,因为分解c时会判断c/p是否为整数,如果是整数的话说明c可以被p整除,则q=c/p,qp=c,而0不能作为分数的分母(除数)。为什么取值范围是[-|c|,|c|]呢?当a=1,b=-5,c=-6时,我们希望输出(x-2)(x-3)=0,-2-3=6=c而此时-2,-3都是负数。

为什么a的取值范围是[1,a]呢?因为当a<0时,一般会让a、b、c分别乘上-1,而等式右边是0,乘-1后不变。所以这样a就恒为正数了。

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 
> 
> 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分解的两个整数相乘的第一个整数,m是另一个整数
> 
>     for( int i = 1; i < a + 1; i++ ){
> 
>         if( a % i == 0 ){
> 
>             // j是c分解的两个整数相乘的第一个整数,n是另一个整数
> 
>             // 也就是说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;
> 
> }

最后放几张算法运行时截的图:

一元二次方程一般式转双根式的算法_第1张图片
image
一元二次方程一般式转双根式的算法_第2张图片
image
一元二次方程一般式转双根式的算法_第3张图片
image

你可能感兴趣的:(一元二次方程一般式转双根式的算法)