#include<stdio.h>
int main()
{
int M, N, a = 1, b;
scanf("%d %d", &M, &N);
int i = 0;
int m, n;
m = M;
n = N;
for(i = 2;i > 0;i++){//从2开始作为被除数
while(1){
if(m % i == 0 && n % i == 0){
a *= i;//公约数
m /= i;
n /= i;
}
else {
b = a*m*n;//公倍数为:公约数 * 不能被约的余数
break;
}
}
//当 m 或 n 有一个不能再被 i 整除时换 i+1
}
printf("%d %d", a, b);
return 0;
}
第一次写的时候用了两层比较繁琐的循环,效率低,线下运行成功,线上pta显示超时
优化之后:
#include<stdio.h>
int main()
{
int a, b, c, z;
scanf("%d %d", &a, &b);
z = a * b;
c = a % b;
if(c == 0){
printf("%d %d", b, z/b);
}
else{
while(c != 0){//辗转相除法
a = b;
b = c;
c = a % b;
}
printf("%d %d", b, z/b);
}
return 0;
}
借鉴了网上的做法,发现用辗转相除法好简单。