您的位置:首页 > 其它

算法--最大公约数和最小公倍数

2012-07-11 11:21 393 查看
#include <stdio.h>
/*
最大公约数和最小公倍数 算法
*****************************
欧几里德算法:   其方法是用较大的数除以较小的数,上面较小的除数和得出的余数构成新的一对数,
继续做上面的除法,直到出现能够整除的两个数,其中较小的数(即除数)就是最大公约数。
大数 = 公约数 * x = 公约数 * (y + z);
小树 = 公约数 * y;

大数 % 小数 = 公约数 * z;
小数 % 公约数 * z = 公约数 * (y%z);         总有y%z == 1的时候
直到整除:
公约数 * n % 公约数 = 0;
*/

/*递归的方法*/
int gcd(int a, int b)
{
return b == 0? a : gcd(b, a%b);
}
/*非递归的方法*/
int gcd1(int a,int b)          //求最大公约数
{
int r;

if(a<b)  /*使a为大数,b为小数*/
{
int temp=a;
a=b;
b=temp;
}
while(a%b)
{
r=a%b;
a=b;
b=r;
}
return  b;
}

/*求b 和n-1个a的最小公倍数*/
int main()
{
int num;
int a,b,k;
int i;

printf("输入a 的 个数:\n");
if(scanf("%d",&num)!=EOF)
{
printf("\ninput b :\n");
scanf("%d",&b);
for(i = 1; i < num; i++)
{
printf("input a :\n");
scanf("%d",&a);
k=gcd(b,a);
b = b/k*a;     /*   b = 公约数 * x
a = 公约数 * y
最小公倍数 = 公约数 * x * y;

这里b保存了前面n - 2个数的最小公倍数
*/
}
printf("最小公倍数为:%d\n",b);
}
system("pause");
return 0;
}


*******************************************************************

运行结果

*******************************************************************

输入a 的 个数:
3

input b :
10
input a :
12
input a :
15
最小公倍数为:60
请按任意键继续. . .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: