求多项式的辗转相除法C语言或者C++语言完整程序,求编程高手拯救,在线等,万分感谢

最好能输出每次相除之后的结果;一经采用追加100分;我的邮箱313570562@qq.com

晕,辗转相除是求最大公约数gcd的吧,怎么都回答成这样啦

a=14; b=21; int c;
while (a%b!=0)
{
int t=a%b; a=b; b=t;

}

return b
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-12-17
怎么创QQ群
第2个回答  推荐于2017-11-28
试试这个代码:
#include<stdio.h>
#include<stdlib.h>
#include<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 = (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");
check_change(&r); //修改余式r的最高次数,即修改r.n
if(r.n==-1) //r.n==-1时,说明最大公因式已经找到
{
printf("所求最大公因式的");
show(ch2); //输出结果
free(r.an); //回收动态分配内存
}
else
do_div(ch2,r); //辗转相除
}
//(x2+2x+1)(x+1)=x3+3x2+3x+1
/*主函数*/
int main()
{
struct chain ch1,ch2,ch;
printf("***************建立第一个多项式**************\n\n");
creat_chain(&ch1);
show(ch1);
printf("***************建立第二个多项式**************\n\n");
creat_chain(&ch2);
show(ch2);
printf("***************以上两个多项式求和**************\n\n");
do_add(&ch,ch1,ch2);
show(ch);
printf("***************以上两个多项式求公因式**************\n\n");
do_div(ch1,ch2);
//回收动态分配内存
free(ch1.an);
free(ch2.an);
free(ch.an);
return 0;
}

参考资料:http://wenku.baidu.com/view/870b5b104431b90d6c85c716.html

本回答被提问者采纳

c++用辗转相除法求最大公约数 我写好的代码 为什么运行的时候说我尝试...
if(m>n){ a=m;b=n;}

C语言 公约数辗转相除法
对于两个数,我们要求是正整数,我们一般用辗转相除法两个数的最大公约数,下面我来仔细讲讲辗转相除法两个数的最大公约数的原理.我们假设这两个数分别是X,Y,他们最大的公约数为M,则有X=a*M,Y=b*M(a,b是互质的数),很明显,我们的目的就是要把M的系数降到一,为此我们进行X%Y运算,实际上X%Y=...

用C语言编写程序求两个数的最小公倍数,并输出
如图使用辗转相除法求最小公倍数:方法步骤:一、打开VC2010(或其他C语言编译器),新建项目-选择Win32为控制台应用程序-命名-确定 二、选择源文件-添加-新建项 三、选择C++文件-命名.c-添加 四、输入如下程序 include <stdio.h> int main(){ int a,b,A,B;int lol,lpl;printf ("输入两个...

如何用C语言求两个数的最大公约数的三种算法
int a,b;int c=0;\/\/计数器 while(1)\/\/循环判断的作用 { printf("输入两个数字求最大公约数:");scanf("%d%d",&a,&b);while(a!=b){ if(a>b)a=a-b;else b=b-a;c++;} printf("最大公约数是:%d\\n",a);printf("%d\\n",c);} return 0;} 运行效果:2、辗转相除法:includ...

C语言求M,N的最大公因数如何来写这个算式
main(){int m,n,t,s;printf("input two number:");scanf("%d%d",&m,&n);if(m<n){t=m;m=n;n=t;} s=m%n;while(s!=0){m=n;n=s;s=m%n;} if(n==1) printf("NO Answer!");else printf("The Answer is %d",n);getch();} ...

C语言编程:输入两个正整数,输出其中最大公约数和最小公倍数。
int main(){ int a,b,num1,num2,temp;printf("please input two number:\\n");scanf("%d%d",&num1,&num2);if(num1<num2){ temp = num1;num1 = num2;num2 = temp;} a = num1;b = num2;while(b!=0){ \/*利用辗除法,直到b为0为止*\/ temp = a%b;a=b;b=temp;} ...

c++程序设计:求两个整数的最大公约数(用两种方法实现,辗转相除法除外...
int i, g;M = a > b ? a : b;m = a < b ? a : b;for(i = 1; i <= m \/ 2; i++){ if((m % i) == 0){ g = m \/ i;if((M % g) == 0)return g;} } return 1;} int Lcm(int a, int b){ int M, m, lcm;M = a > b ? a : b;m = a <...

用C语言编译 求三个正整数的最小公倍数
用欧几里德算法(辗转相除法)求两个数的最大公约数的步骤如下:先用小的一个数除大的一个数,得第一个余数;再用第一个余数除小的一个数,得第二个余数;又用第二个余数除第一个余数,得第三个余数;这样逐次用后一个数去除前一个余数,直到余数是0为止。那么,最后一个除数就是所求的最...

用c语言编写求最大公约数的程序 ,不需要辗转相除法,最简单的FOR循环或 ...
不用辗转相除,只需要根据数学定义,找出最大的可以同时整除两个数值,即为最大公约数。代码如下:int gcd(int a,int b)\/\/求a,b的最大公约数,并返回。{ int r = a>b?b:a; while(r) { if(a%r==0 && b%r==0)break;\/\/最大的可以同时整除二者的数,即为最大公约数。

C语言程序设计如何求最大公约数?
具体操作步骤如下:一、新建一个C语言源程序,使用Visual C++6.0的软件。二、从键盘中输入两个正整数a和b。代码:printf("please input two number:\\n");int a,b;scanf("%d%d",&a,&b)。三、取两个数a,b中的较小值存放到变量n中。代码:int n=a;if (n>b)n=b。四、从两个数a...

相似回答