本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
73 2044
本题所用算法:用辗转相除法算最大公约数,而最小公约数=所给两正整数的乘积除以最大公约数。
#include <stdio.h>
#include <stdlib.h>
int GCD(int a,int b);
int LCM(int a,int b,int c);
int main ()
{
int M,N;
scanf("%d %d",&M,&N);
printf("%d %d\n",GCD(M,N),LCM(M,N,GCD(M,N)));
system("pause");
return 0;
}
int GCD(int a,int b)
{
int t;
while(b!=0)
{
t=a%b;
a=b;
b=t;
}
return a;
}
int LCM(int a,int b,int c) //分别为两整数和最大公约数
{
c=a*b/c;
return c;
}
求最大公约数除了用辗转相除法之外,还可以用枚举法:
#include<stdio.h>
#include<stdlib.h>
int main ()
{
int a,b;
int min;
int i;
int number;
printf("请输入两个数:",a,b);
scanf("%d %d",&a,&b);
if(a<b)
{
min=a;
}else
{
min=b;
}
for(i=1;i<=min;i++)
{
if(a%i==0)
{
if(b%i==0)
{
number=i;
}
}
}
printf("最大公约数为:%d\n",number);
system("pause");
return 0;
}
而辗转相除法则简单多了:
#include<stdio.h>
#include<stdlib.h>
int main ()
{
int a,b;
int t; //余数
printf("请输入两个数:",a,b);
scanf("%d %d",&a,&b);
while(b!=0)
{
t=a%b;
a=b;
b=t;
}
printf("最大公约数为:%d\n",a);
system("pause");
return 0;
}