实例四十八:最大公因式问题
问题描述:
编制利用辗转相除法求两个多项式的最大公因式。
算法思路:
设多项式的系数按照幂次由高到低的顺序存于一维数组中,多项式的最高幂次存于一变量中。
辗转相除法求两多项式去除另一个多项式,然后将所得余式变成除式,原除式变为被除式。如此反复相除,直到余式为零,最后的除式即为最大公因式。
#include<stdio.h>
#define N 10
int main()
{
float a[N+1],b[N+1],c[N+1];
int i,j,n,m,k,flag;
float x,y;
printf("Please input the highest power of two polynomials(n,m):");
scanf("%d,%d",&n,&m);
printf("Please enter the coefficients of the terms of the polynomial(x) in order of power from high to low:\n");
for(i=ni>=0;i--)
scanf("%f",&a[i]);
printf("请按幂次由高到低输入多项式B(x)各项的系数:\n");
for(j=m;j>=0;j--)
scanf("%f",&b[j]);
if(n<m)
{
for(i=n;i>=0;i--)
{
c[i] = a[i];
a[i] = b[i];
b[i] = c[i];
}
for(i=n+1;i<=m;i++)
a[i] = b[i];
flag = n;n = m;m = flag;
}
flag = 1;
while(flag)
{
for(k=n-m;k>=0;k--)
{
x = a[k+m]/b[m];
for(j=m-1;j>=0;j--)
{
y = a[k+j] - x * b[j];
a[k+j] = (y<0.0005 && y>-0.0005)?0.0:y;
}
}
for(i=m;i>=0;i--}
c[i] = b[i];
for(flag=0,i=m-1;i>=0;i--)
{
if(a[i]!=0)
flag = 1;
b[i] = a[i];
}
for(i=m;i>=0;i--)
a[i] = c[i];
n = m--;
}
printf("这两个多项式的公因式是:");
for(i=n;i>=0;i--)
if(i!=0)
printf("%4.1fx^%d+",a[i],i);
else
printf("%4.1f\n",a[i]);
return 0;
}