📄 gc_8_6_gongyinshi.c
字号:
# include <stdio.h>
int Remainder(double *pA,int an,double *pB,int bn,double **q)
/*已知两多项式的系数和幂次,返回最大公因式的幂次,在*q得到系数表的首指针*/
{
double x,y,*temp;
int k,j,flg = 1;
if (an < bn){ /*使多项式A(x)的幂次不低于多项式B(x)的幂次*/
temp = pA;pA = pB; pB = temp;
k = an; an = bn; bn = k;
}
while(flg) { /*循环至余式为0结束,如果余式不等于0,岂不是死循环?*/
while (*pB == 0.0 && bn > 0) { /*掠过多项式B(x)最高次系数为0的项*/
bn--;pB++; /*bn 等于 0 时,是指向常数项吧*/
}
k = 0;x = *pB;
while (k <= bn) pB[k++] /= x; /*使多项B(x)多项式最高次项的系数规约为1,这个过程中,
每个项都除以了x,*/
for(k = 0;k <= an - bn; k++) { /*A(x)/B(x),商多项式有an - bn + 1项*/
x = pA[k]; /*商多项式的当前系数x = pA[k] */
for(j = 0;j<bn;j++) { /*从A(x)中减去x*B[x] ,也就是除一次的余式 */
y = pA[k+j+1]-x*pB[j+1];
pA[k+j+1] =(y<.00005 && -y<.00005)?0.0:y; /*pA[k]应置为0,因不再使用,该值未置0*/
}
}
temp = pA;pA = pB;pB = temp+an-bn+1;an = bn--;
for(flg = 0,k = 0;k<=bn && flg == 0;k++) /*判多项式B(x)是否为0 */
if(pB[k] != 0.0) flg = 1;
}
*q = pA;
return an;
}
void main()
{
int an=6; int bn=5;
double min_a[30]={1.0, 0.0, 0.0, 4.0, 0.0, 0.0, 3.0}; /*(x3+ 1)(x3+3)=x6+4x3+3 x3表示x的立方*/
double min_b[30]={1.0, 0.0, 1,0, 1.0, 0.0, 1.0};/*(x3+1)(x2+1)=x5+x3+x2+1 系数没有的表示系数等于0*/
//double min_b[30]={1.0,1.0};
double * q;
int result; //最大公因式的幂次
result = Remainder(min_a,an,min_b,bn,&q);
printf("输出最大公因式\n");
printf("最大公因式的幂次是 %d\n",result);
for (an=0;an<=result;an++)
printf(" %f\n",(*q++));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -