资源描述:
《多项式辗转相除法求最大公因式》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、#include#include#includestructchain//定义一个多项式的结构体{intn;//该多项式的最高次数double*an;//存放多项式的系数};voidcreat_chain(structchain*c)//建立一个多项式{inti,n;doubleai;printf("请输入该多项式最高次数:");scanf("%d",&n);(*c).n=n;(*c).an=(double*)calloc(n+1,sizeof(double));//给该多项式系数动态分配内存print
2、f("按下列格式输入系数:(例如x^4+2x^3-7x^1+5输入:120-75)");printf("等待输入:");for(i=n;i>=0;i--){scanf("%lf",&ai);(*c).an[i]=ai;}}voidshow(structchainc)//按照多项式的格式显示多项式{inti=c.n;printf("多项式是:");while(i>=0){if((i!=c.n)&&(c.an[i]>=0))printf("+");switch(i){case1:printf("%.2lfX",c.an[i]);break;case0:pr
3、intf("%.2lf",c.an[i]);break;default:printf("%.2lfX^%d",c.an[i],i);break;}i--;}printf("");}voiddo_add(structchain*ch,structchainch1,structchainch2)//两个多项式求和{inti;if(ch1.n>=ch2.n){(*ch).n=ch1.n;//求和之后多项式的最高次应是ch1和ch2中较高的次数(*ch).an=(double*)calloc((*ch).n+1,sizeof(double));for(i=0;
4、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[
5、i]=ch2.an[i];}}}voidcheck_change(structchain*r)//检验多项式r的最高次数并进行相应的修改{inti=(*r).n;while((fabs((*r).an[i])<=1e-5)&&(i>=0))//依次从高次项向低次项进行系数检验i--;(*r).n=i;//注意:如果多项式r为0,这里i=-1}boolcheck_zero(structchainr)//检验多项式r的最高次数{inti;for(i=0;i<=r.n;i++)if(fabs(r.an[i])>=1e-6)//如果一旦有一个不为零,返回false
6、returnfalse;returntrue;//全为零的情况下返回true}voiddo_div(structchainch1,structchainch2)//辗转相除法,公式:ch1=q*ch2+r;{inti=0,j;doubletmp;structchainq,r;if(check_zero(ch2))//判断所除的多项式是否为0,若为0,退出;{printf("所除的多项式不能为0!");exit(0);}q.n=ch1.n-ch2.n;//q的最高次数为ch1和ch2最高次数相减r.n=ch1.n-1;r.an=(double*)call
7、oc(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的最高次数减1q.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];//高次对应相减elser.an[j
8、]=ch1.an[j];//低次保留}if(check_zero(