문제 링크
난이도 : 브론즈 1

문제 내용

두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에는 두 개의 자연수가 주어진다. 이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다.

출력

첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.

문제 분석

원래는 약수들 저장해서 분석하려고 했으나 자꾸 틀렸다고 하길래

유클리드 호제법 찾아봄

두 수 a, b의 최소공배수는 b, b%a의 최소공배수와 같음

최대공약수는 a*b를 최소공배수로 나눈것과 같음

작성한 코드

#include <bits/stdc++.h>
 
using namespace std;
 
int main() {
    int a, b;
    scanf("%d %d", &a, &b);
    int gcd_ab = gcd(a, b);
    int lcm_ab = abs(a * b) / gcd_ab;
    printf("%d\\n%d", gcd_ab, lcm_ab);
}

최대공약수 gcd_ab

최소공배수 lcm_ab로 저장

우수 코드 분석

#include <stdio.h>
 
int main()
{
	int a,b,d;
	scanf("%d %d", &a, &b);
	d=a;
	while(d%b!=0) d+=a;
	printf("%d\\n%d", a*b/d, d);
	return 0;
}

여기서 d가 최대공약수인듯

최대공약수 구하는 방법을 b로 안나눠질때까지 a를 더하는 방법으로 함