多项式辗转相除法求最大公因式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
{
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");