1992年高级程序员下午试题6

阅读下列程序说明和 C 程序,把应填入其中__n__ 处的字句,写在答卷的对应栏内。

[程序说明]

(1)本程序利用辗转相除法求两个均不超过100次的多项式A,B的最大公因式。

例: A(x)=x3一x2+x一1=(x2+1)(x一1)

B(x)=x5一7x4十7x3-3x2+6x+4=(x2+1) (x3-7x2十6x+4)

最大公因式为x2+1。

(2)辗转相除法的算法如下:

用其中的一个多项式去除另一个多项式;然后,将所得余式变成除式,原除式变成被除式。如此反复相除,当余式为。时,当前除式即为最大公因式。

[程序]

#include <stdio.h>

#include <math.h>

#define DECISE.0005

#define MAX_POWER 100

main( )

{ int i,a,b;

  float Ca[MAX_POWER+1],Cb[MAX _POWER+1];

  void Remainder();

  scanf("%d",&a);

  for ( i=0;i<=a;i++ )

  scanf( "%f",&Ca[i] );

  scanf( "%d",&b) ;

  for ( i=0;i<=b;i++ )

    scanf( "%d",&Cb[i] );

  Remainder(Ca,Cb,a,b);

}

void Remainder(Pointer A,Pointer B,a,b)

float *Pointer A,*Pointer B;

int a,b;

{ float x,y,*Temp;

  int i,j,F1ag=1;

  while ( Flag )

  { i=0;

   while ( PointerB[i]==0 )

   { i ++;b一-;

     Pointer B+=i-- ;

   }

   x=Pointer[i];

   while ( i<=b )

   PointerB[i++]/=x;

   for ( i=0;i<=a-b;i++ )

   { X=Pointer A[i] ;

    for(j=0;j<b ; j++) 

    { y = PointerA[i+l+j]一x * PointerB[j+1];

     PointerA[ i+1+j ]=

     ( y<DECISE&&-y<DECISE )?0.0;y;

    }

    }

    Temp=Pointer A;

    PointerA=PointerB; ·

    PointerB =(a>=b)?Temp+a-b-1:Temp;

    a=b--;

    for ( Flag=0,i=0;i<b && Flag==0;i++ )

    if ( PointerB[i] !=0.0 ) Flag=1;

  }

  printf( "The Greatest Common Factor is:\n");

  for ( i=0;i<a;i++ )

    if ( PointerA[i]!= 0.0)

  printf( "%5.3f *x ∧%d%s",

  PointerA[I],a-i,( PointerA[i+1]<0.0 ) ?"":"+" );

  printf( "%5.3f\n",PointerA[a] );

}

原文地址:https://www.cnblogs.com/djcsch2001/p/2098566.html