728x90
https://www.acmicpc.net/problem/2702
문제 설명
두 정수 a와 b 최소공배수는 두 수의 공통된 배수 중 가장 작은 수이고, 최대공약수는 두 수의 공통된 약수중 가장 큰 수이다.
a와 b가 주어졌을 때, 최소공배수와 최대공약수를 구하는 프로그램을 작성하시오.
풀이 과정
- 나의 풀이
① 최대공약수 구하는 법
유클리드 호제법을 통해 최대공약수를 쉽게 구할 수 있다.
유클리드 호제법이란 기원전 300년 전에 나온 가장 오래된 알고리즘으로 유명하다.
유클리드 호제법으로 최대공약수를 구하는 방법은 다음과 같다.
○ 두 자연수 a,b에 대하여 a를 b로 나눈 나머지 r에 대해 a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이를 계속 반복하며 b가 0이 될 때, a값이 바로 최대공약수이다. (재귀와 반복이 느껴진다..!!)
② 최소공배수 구하는 법
입력값인 두 정수 a,b에 대하여 a = x * gcd , b = y * gcd (단, gcd는 a와 b의 최대공약수이고, x와 y는 서로 서로소 관계이다.) 이므로 최소공배수는 a*b//gcd가 된다..!!
이를 코드로 구현하면 다음과 같다.
# 1850 최대공약수
import sys
input = sys.stdin.readline
T = int(input())
def gcd_for(a,b) :
while b > 0 :
tmp = a%b
a = b
b = tmp
return a
def gcd_r(a,b) :
if b == 0 :
return a
else :
return gcd_r(b,a%b)
def lcm(a,b) :
return a*b//gcd_r(a,b)
for _ in range(T) :
a, b = map(int,input().split())
print(lcm(a,b),gcd_r(a,b))
○ gcd_for 함수는 반복문을 이용하였고, gcd_r 함수는 재귀를 이용하였다.
후기
최대공약수 및 최소공배수에 관한 여러 문제를 풀어봐야겠다..!!
'Algorithm > math' 카테고리의 다른 글
[백준] 9613 GCD 합 (파이썬 Python) (0) | 2021.08.13 |
---|---|
[백준] 13241 최소공배수 (파이썬 Python) (0) | 2021.08.13 |
[백준] 1934 최소공배수 (파이썬 Python) (0) | 2021.08.13 |
[백준] 1193 분수 찾기 (파이썬 Python) (0) | 2021.08.11 |
[백준] 1011 Fly me to the Alpha Centauri (파이썬 Python) (0) | 2021.07.08 |