多项式辗转相除法求最大公因式

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#include

#include

struct chain //定义一个多项式的结构体

{

int n; //该多项式的最高次数

double *an; //存放多项式的系数

};

void creat_chain(struct chain *c) //建立一个多项式

{

int i,n;

double ai;

printf("请输入该多项式最高次数:");

scanf("%d",&n);

(*c).n = n;

(*c).an = (double *)calloc(n+1,sizeof(double)); //给该多项式系数动态分配内存printf("按下列格式输入系数:(例如x^4 + 2x^3 - 7x^1 + 5 输入:1 2 0 -7 5)\n");

printf("等待输入:");

for(i=n;i>=0;i--)

{

scanf("%lf",&ai);

(*c).an[i] = ai;

}

}

void show(struct chain c) //按照多项式的格式显示多项式

{

int i=c.n;

printf("多项式是:");

while(i>=0)

{

if((i!=c.n)&&(c.an[i]>=0))

printf(" + ");

switch(i)

{

case 1:printf("%.2lfX",c.an[i]);break;

case 0:printf("%.2lf",c.an[i]);break;

default:printf("%.2lfX^%d",c.an[i],i);break;

}

i--;

}

printf("\n");

}

void do_add(struct chain *ch,struct chain ch1,struct chain ch2) //两个多项式求和{

int i;

if(ch1.n>=ch2.n)

{

(*ch).n = ch1.n; //求和之后多项式的最高次应是ch1和ch2中较高的次数

(*ch).an = (double *)calloc((*ch).n+1,sizeof(double));

for(i=0;i<=(*ch).n;i++)

{

if(i<=ch2.n)

(*ch).an[i] = ch1.an[i] + ch2.an[i]; //相同次数的系数相加

else

(*ch).an[i] = ch1.an[i]; //直接保ch1中有而ch2中没有的项的系数}

}

else //与上面if相反

{

(*ch).n = ch2.n;

(*ch).an = (double *)calloc((*ch).n+1,sizeof(double));

for(i=0;i<=(*ch).n;i++)

{

if(i<=ch1.n)

(*ch).an[i] = ch1.an[i] + ch2.an[i];

else

(*ch).an[i] = ch2.an[i];

}

}

}

void check_change(struct chain *r) //检验多项式r的最高次数并进行相应的修改{

int i = (*r).n;

while((fabs((*r).an[i])<=1e-5)&&(i>=0)) //依次从高次项向低次项进行系数检验i--;

(*r).n = i; //注意:如果多项式r为0,这里i=-1

}

bool check_zero(struct chain r) //检验多项式r的最高次数

{

int i;

for(i=0;i<=r.n;i++)

if(fabs(r.an[i])>=1e-6) //如果一旦有一个不为零,返回false

return false;

return true; //全为零的情况下返回true

}

void do_div(struct chain ch1,struct chain ch2) //辗转相除法,公式:ch1 = q*ch2+r; {

int i = 0,j;

double tmp;

struct chain q,r;

if(check_zero(ch2)) //判断所除的多项式是否为0,若为0,退出;

{

printf("所除的多项式不能为0!\n");

exit(0);

}

q.n = ch1.n - ch2.n; //q的最高次数为ch1和ch2最高次数相减

r.n = ch1.n - 1;

r.an = (double *)calloc(r.n+1,sizeof(double)); //为系数动态分配内存

q.an = (double *)calloc(q.n+1,sizeof(double));

while(i<=q.n)

{

r.n = ch1.n - 1; //r的最高次数为ch1的最高次数减1

q.an[q.n-i] = ch1.an[ch1.n]/ch2.an[ch2.n]; //多项式q的最高次项系数

tmp = q.an[q.n-i];

for(j=r.n;j>=0;j--)

{

if(j>=q.n-i)

r.an[j] = ch1.an[j] - tmp*ch2.an[j-q.n+i]; //高次对应相减

else

r.an[j] = ch1.an[j]; //低次保留

}

if(check_zero(r)) break; //若余式r系数全为零,退出循环

ch1 = r; //ch2没除干净,将r赋给ch1,继续除ch2

i++;

}

printf("---------------------------------------------\n");

printf("q(x):");

show(q); //显示每一步的多项式q

printf("r(x):");

show(r); //显示每一步与q对应的多项式r

printf("---------------------------------------------\n");

相关文档
最新文档