算法--最大公约数和最小公倍数
#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 请按任意键继续. . .