首页 > 试题广场 >

求最大公约数和最小公倍数。输入两个正整数m和n(m=100

[问答题]

求最大公约数和最小公倍数。输入两个正整数m和n(m<=1000,n<=1000),求其最大公约数和最小公倍数。试编写相应程序。

推荐
#include <stdio.h>
 int main (void)
 {
 int m, n, p, tmp;
 printf ("Please type in two number:\n");
 scanf ("%i %i", &m, &n);        //输入两个数,分别放入m, n
 p=m*n;                          //先把两数的积算出来,后面m和n的值会有变
 while (n!=0){
 tmp=m%n;
 m=n;
 n=tmp;                  //这段是求最大公约数的算法
 }
 printf ("The GCD is %i\n", m);  //上面的算法n=0时m这时的值就是最大公约数
 printf ("The LCM is %i\n", p/m);//两数的积除以最大公约数就是最小公倍数了
 return 0;
 }

发表于 2018-05-06 21:25:16 回复(1)
#include<stdio.h>
int main(void)
{int m,n,a,max,k=2,i,min;
printf("输入两个正整数m和n(m<=1000,n<=1000)\n");
scanf("%d%d",&m,&n);
if(m<n)  /*让m始终小于n*/
{m=m;
n=n;;
}
else {a=m;
 m=n;
 n=a;}
for(i=m;i<=m;i--)
{if(m%i==0&&n%i==0){
max=i;
printf("max=%d",max);
break;
}
}
while(k>1){
 min=m*k;
 if(min%n==0)
 {printf("min=%d",min);
 break;
 }
 k++;
}
return 0;
}

发表于 2019-10-05 12:34:09 回复(1)
1.自己写的比较麻烦
#include<stdio.h>
int main(){
    int i,m,n,max,min,upper,lower;
    //循环变量:i:两数:m、n;最大公约数:max;最小公倍数:min;m、n中的较大者、较小者:upper、lower

    printf("input two numbers: ");
    scanf("%d%d",&m,&n);

    if(m>0&&m<=1000&&n>0&&n<=1000){
        upper = m>n?m:n;    //使用三目运算 找到两数中的最大最小值
        lower = m<n?m:n;

        //最大公约数不超过两数的最小者,且大于等于1
        for(i=lower;i>=1;i--){  // 可以换成 从1000到1
        //从lower开始找最大公约数,如果两数对 i 求模皆为0,则为最大公约数
            if(m%i==0 && n%i==0){
                max = i;
                break;
            }
        }

        //最小公倍数至少是两数中的最大者,且一定是最大者的倍数,同时不超过两者的乘积
        //在此条件下只需要找到最小数的倍数即可
        for(i=upper;i<=m*n;i+=upper){   //可以换成 1到 m*n
            if(i%lower==0){
                min = i;
                break;
            }
        }

        printf("greatest common divisor is: %d, least common multiple is: %d\n",max,min);
    }else{
        printf("invalid value\n");
    }

    return 0;
}
2.辗转相除法
#include<stdio.h>
/*
辗转相除法:
1.如果b==0,计算结束,a为最大公约数;
2.否则,计算a%b的结果c,然后更新变量,让a=b,b=c;
3.回到第一步

注:若输入为两个数m、n,则最大公约数*最小公倍数 == m*n
*/
int main(){
    int m,n,a,b,c;
    //m、n为输入;a、b暂存m、n;c为a%b的结果

    printf("input two numbers: ");
    scanf("%d%d",&m,&n);

    a=m;    //给a、b赋值计算最大公约数,m、n保留计算最小公倍数
    b=n;
    //核心思想是:“不再有剩下的”
    while(b!=0){    //1.如果b==0,计算结束,a为最大公约数;
        c = a%b;    //2.否则,计算a%b的结果c
        a = b;      //然后更新变量,让a=b,b=c;
        b = c;
    }

    printf("gcd = %d\n,lcm = %d\n",a,m*n/a);//计算结束,a为最大公约数;最大公约数*最小公倍数 == m*n

    return 0;
}
3.更相损减术
#include<stdio.h>
/*
更相损减术:
1.若a>b,a=a-b;若a<b,b=b-a
2.若a==b,则a为两数的最大公约数
3.若a!=b,返回1.
*/
int main(){
    int m,n,a,b;

    printf("input two numbers: ");
    scanf("%d%d",&m,&n);

    a=m;    //给a、b赋值计算最大公约数,m、n保留计算最小公倍数
    b=n;
    while(a!=b){
        if(a>b) a=a-b;
        else    b=b-a;
    }
    printf("gcd = %d\nlcm = %d\n",a,m*n/a);

    return 0;
}





发表于 2022-01-14 12:31:46 回复(0)
czd头像 czd
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);  int m = scanner.nextInt();  int n = scanner.nextInt();  int p = n * m;  // 保证 m > n    if (n > m) {  int t = m;
        m = n;
        n = t;
    } int result = m % n; while (result != 0) {
        m = n;
        n = result;
        result = m % n;
    }
    System.out.println("最大公约数是:" + n);
    System.out.println("最小公倍数是:" + p / n);
}


发表于 2018-11-15 22:43:57 回复(0)