![]() ![]() |
|
C趣味程序(二)(07)求多个整数的最大公约数与最小公倍数 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 13:58:59 文章录入:杜斌 责任编辑:杜斌 | |
|
|
对于3个或3个以上整数,最大公约数与最小公倍数有以下性质: (a1,a2,a3)=((a1,a2),a3) (a1,a2,a3,a4)=((a1,a2,a3),a4),... {a1,a2,a3}={{a1,a2},a3} {a1,a2,a3,a4}={{a1,a2,a3},a4},... 应用这一性质,要求n个数的最大公约数,先求出前n-1个数的最大公约数t,再求第n个数与t的最大公约数。求n个数的最小公倍数也一样。这样递推实现求多个整数的最大公约数与最小公倍数。 程序代码如下: #include<stdio.h> int gy(int,int); int gb(int,int); void main() { int a,b,c,d,i=2; int aa[10]; printf("n个整数的最大公约记为(a1,a2,...an)\n"); printf("n个整数的最小公倍记为{a1,a2,...an}\n"); printf("n个整数逐个从键盘输入,以-1终止\n"); printf("首先输入两个数a,b\n"); scanf("%d,%d",&a,&b); c=a; d=a; aa[0]=a;aa[1]=b; while(b>0) { c=gy(c,b); /*调用最大公约数函数*/ d=gb(d,b); /*调用最小公倍数函数*/ printf("输入下一个整数(输入-1结束):to b: "); scanf("%d",&b); aa[i]=b; i++; } printf("("); for(i=0;aa[i]!=-1;i++) printf("%d,",aa[i]); printf(") = %d\n",c); printf("{"); for(i=0;aa[i]!=-1;i++) printf("%d,",aa[i]); printf("} = %d\n",d); } int gy(int x,int y) { int c; for(c=x;c>=1;c--) { if((x/c==(float)x/c)&&(y/c==(float)y/c)) break; } return c; } int gb(int x,int y) { int d; for(d=x; d<=x*y;d+=x) { if(d/y==(float)d/y) break; } return d; } 程序运行结果如下:
说明: 对n(n>=3)个整数,不存在最大公约与最小公倍的积等于这n个整数之积的性质。因此不能套用2个整数的性质,以防出错。 |
|
![]() ![]() |