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

#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
请按任意键继续. . .

你可能感兴趣的:(算法)