求两个正整数的最大公约数和最小公倍数并拓展到n个正整数

输入两个正整数m和n求其最大公约数和最小公倍数
    用辗转相除法进行求解
#include<stdio.h>
int main()
{
    int m,n,r,p,t;
    while(~scanf("%d %d",&n,&m))//输入多组值
    {
        p=m*n;//科普:n个数的乘积与他们的最小公约数和最大公倍数的值相等
        if(n>m)//将简答的值赋给m,否则交换他们的值
        {
            t=n;
            n=m;
            m=t;
        }
        while(n!=0)//辗转相除法求最大公约数
        {
            r=m%n;
            m=n;
            n=r;
        }
        printf("最大公约数为%d\n",m);
        printf("最小公倍数为%d\n",p/m);
    }
    return 0;
}
辗转相除法:定义自己百度
拓展:求n个数的最小公倍数和最大公约数
运用递归的思想
#include<stdio.h>
int f( int x,int y)
{
    int t,r,s;
    if(x<y)
    {
        t=x;
        x=y;
        y=t;
    }
    while(y!=0)
    {
        r=x%y;
        x=y;
        y=r;
    }s=x;
    return s;//跟上面两个数的求最大公约数的方法一样
}
int main()
{
    int n1,n2;
    int i,n;
    while(scanf("%d",&n)!=EOF)//输入n个整数,并可以输入多组
    {
        scanf("%d",&n1);//就相当于化学思想里的定一议二
        for(i=1; i<n; i++)//一共输入n个数,已经输入n1,所以这次循环输入n-1个数
        {
            scanf("%d",&n2);
            );//每次都将n1和n2的最小公倍数赋值n1,依次进行下去,这就是递归的思想
        }
        printf ("n个数的最小公倍数为%d\n",n1);
       
    }
    return 0;
}

//上面运用n1=(n1/f(n1,n2)*n2/f(n1,n2))*f(n1,n2)是有的题目中要求在int 范围内,n1*n2的值可能大于这个范围
这是我的理解。。。。。

猜你喜欢

转载自taoyongpan.iteye.com/blog/2255847