本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
73 2044
鸣谢安阳师范学院段晓云老师和软件工程五班李富龙同学补充测试数据!
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<stdio.h>
int main()
{
int M,N;
int m=1,n=1,max=0,min=1;
scanf("%d %d",&M,&N);
if(M>N){
for(;n<=N;n++){
if(M%n==0&&N%n==0){
if(n>max){
max=n;
}
}
}
printf("%d ",max);
}else{
for(;n<=M;n++){
if(M%n==0&&N%n==0){
if(n>max){
max=n;
}
}
}
printf("%d ",max);
}
if(M>N){
for(;m<=N;m++){
if(M%m==0&&N%m==0){
min*=m;
}
}
min=min*(M/max)*(N/max);
printf("%d",min);
}else{
for(;m<=M;m++){
if(M%m==0&&N%m==0){
min*=m;
}
}
min=min*(M/max)*(N/max);
printf("%d",min);
}
return 0;
}
进一步优化
#include<stdio.h>
int main()
{
int a,b;//define two integer 定义两个整数
int t;//define an intermediate variable 定义一个中间变量
scanf("%d %d",&a,&b);
int z=a*b;
while(a%b!=0){
t=a%b;
a=b;
b=t;
}//use division algorithm 使用辗转相除法
printf("%d ",b);
//gcd 最大公约数
printf("%d",z/b);
//lcm (最小公倍数)= 两个整数之积除以最大公约数
return 0;
}