多项式辗转相除法求最大公因式_第1页
多项式辗转相除法求最大公因式_第2页
多项式辗转相除法求最大公因式_第3页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、蒃#include<stdio.h>衿 #in clude<stdlib.h>蚆 #in clude<math.h>莄蒅 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

2、 = (double *)calloc(n+1,sizeof(double);/给该多项式系数动态分配内存蚈printf(”按下列格式输入系数:(例如xA4 + 2xA3 - 7xA1 + 5输入:1 2 0 -7 5)n");莆printf(" 等待输入 :");膂for(i=n;i>=0;i-)肇scanf("%lf",&ai);肆(*c).ani = ai;莀莇薃莁蒆 int i=c.n;芆 printf(" 多项式是 :");蚃 while(i>=0)腿袈 if(i!=c.n)&&

3、(c.ani>=0)蚆 printf(" + ");莄switch(i)芀羆case 1:printf("%.2lfX",c.ani);break;膅case 0:printf("%.2lf",c.ani);break;袀default:pri ntf("%.2lfXA%d",c.a ni,i);break;芁荿i-;袃 void show(struct chain c)/ 按照多项式的格式显示多项式薅printf("n");聿蒇羄 void do_add(struct chain *ch

4、,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).ani = ch1.ani + ch2.ani; / 相同次数的系数相加肆else薆(*ch).ani = chl.ani;/直接保chi中有而

5、ch2中没有的项的系数薂肀葿else/ 与上面 if 相反羅节(*ch).n = ch2.n;袈(*ch).an = (double *)calloc(*ch).n+1,sizeof(double);莅肃if(i<=ch1.n)罿(*ch).ani = ch1.ani + ch2.ani;蚅else螄(*ch).ani = ch2.ani;螃羀羈芃薃薇for(i=0;i<=(*ch).n;i+)螈 void check_change(struct chain *r)/ 检验多项式 r 的最高次数并进行相应的修改膆蚃 int i = (*r).n;芄 while(fabs(*r).a

6、ni)<=1e-5)&&(i>=0) / 依次从高次项向低次项进行系数检验衿i-;葿 (*r).n = i;/ 注意:如果多项式 r 为 0 ,这里 i=-1莆螀袀 bool check_zero(struct chain r)/ 检验多项式 r 的最高次数螆 int i;蚈if(fabs(r.ani)>=1e-6) / 如果一旦有一个不为零,返回 false螅return false;膅return true; / 全为零的情况下返回 true蒁for(i=0;i<=r.n;i+)芁蝿肈 void do_div(struct chain ch1,str

7、uct 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

8、.an = (double *)calloc(q.n+1,sizeof(double);节while(i<=q.n)螁螅 r.n = ch1.n - 1; /r 的最高次数为 ch1 的最高次数减 1薆q.anq.n-i = ch1.anch1.n/ch2.anch2.n;/ 多项式 q 的最高次项系数羃 tmp = q.anq.n-i;薈膈for(j=r.n;j>=0;j-)肅螃if(j>=q.n-i)蕿 r.anj = ch1.anj - tmp*ch2.anj-q.n+i; / 高次对应相减/ 低次保留/ 若余式 r 系数全为零 ,退出循环芆elser.anj = ch

9、1.anj;if(check_zero(r) break;蚈 ch1 = r; /ch2 没除干净,将 r 赋给 ch1, 继续除 ch2袄 i+;螇 printf("n");莃 printf("q(x):");蚀 show(q); / 显示每一步的多项式 q蒀 printf("r(x):");袅 show(r); / 显示每一步与 q 对应的多项式 r螃 printf("n");薁 check_change(&r); / 修改余式 r 的最高次数,即修改 r.n 芇蒆 if(r.n=-1) /r.n=-1

10、 时,说明最大公因式已经找到 膁莈printf(" 所求最大公因式的 ");莆show(ch2); / 输出结果袆free(r.an); / 回收动态分配内存袁蒀 else螈 do_div(ch2,r); / 辗转相除芅蚂 蒁 void main()螄 struct chain ch1,ch2,ch;printf("*建立第一个多项式*nn");芈 creat_chain(&ch1);艿 show(ch1);printf("*建立第二个多项式*nn");膃 creat_chain(&ch2);莀 show(ch2);printf("*以上两个多项式求和 *

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论