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

【一元二次方程一般式转双根式的算法】先说思路:
大体思路就是输入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; > > }

最后放几张算法运行时截的图:
一元二次方程一般式转双根式的算法
文章图片
image 一元二次方程一般式转双根式的算法
文章图片
image 一元二次方程一般式转双根式的算法
文章图片
image

    推荐阅读