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

合集下载
相关主题
  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:Pri ntf("%.2lfX^%d",c.a n[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];

ZZ 直接保ch1中有而ch2中没有的项的系数

}

} else ZZ 与上面 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)

ZZ 检验多项式 r 的最高次数并进行相应的修改

{ int i = (*r).n;

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

i--;

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

}

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,退出 ;

{ bool check_zero(struct chain r)

{ int i;

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

ZZ 检验多项式 r 的最高次数

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赋给chi,继续除ch2 i++;

}

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

printf("q(x):");

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

printf("r(x):");

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

相关文档
最新文档