[python] 여러개의 수에서 GCD, LCM 구하기
시험기간임에 OpenCV를 공부하기는 정상적으로 집중하기 힘들기에..
실시간 시스템을 공부하던중 여러 수의 LCM을 어떻게 구현할까에 대한 고민을 하였다.
15 와 20의 최소공배수는 직관적으로 60임을 알 수 있다.
또한 최대공약수는 5임을 역시 직관적으로 알 수 있다.
또한 우리는 이에 대한 알고리즘을 알고있다.
기존 GCD알고리즘
def GCD(a, b): if b > a: temp = a a = b b = temp while(b>0): temp = b b = a%b a = temp return a
별 다른 예외처리없이 구성된 GCD 알고리즘이다.
기존 LCM알고리즘
def LCM(a,b): gcd = GCD(a,b) a = a // gcd # 어차피 나누어 떨어지긴하는데 가독성상 명시적으로 b = b // gcd return (gcd * a * b)
역시 별 다른 예외처리없이 구현하였다.
이를 args로 받아왔을 때 어떻게 구현할지에 대해
ex) 15, 20, 30이 들어왔다.
최대 공약수 구하기
- 15와 20의 최대공약수를 구한다. = 5
- 이 결과로 나온 5와 30의 최대공약수를 구한다 = 5
- 끝
최소 공배수 구하기
- 15 와 20의 최소공배수를 구한다. = 60
- 60과 30의 최소공배수를 구한다. = 60
- 끝
정말 간단한 것..
프로그램으로 구현할 때는 여기에 한 단계를 더 추가해주면된다
args로 한 엘리먼트씩 슬라이싱 하므로 맨 처음에는 GCD나 LCM이나 parameter가 1개씩밖에 못들어간다.
즉 파라미터가 1개일때는 어떻게 구할까?
- 그냥 리턴해준다.
- 끝
더욱 간단한 것..
즉, GCD와 LCM구현에서 a,b값을 받을때 b에 디폴트로 None을 넣어주고
b가 None이면 바로 a를 return해버리면 된다.
최종코드..
# -*- coding: utf-8 -*- def GCD(a, b= None): if not b: return a if b > a: temp = a a = b b = temp while(b>0): temp = b b = a%b a = temp return a def LCM(a,b=None): if b == None: return a gcd = GCD(a,b) a = a // gcd # 어차피 나누어 떨어지긴하는데 가독성상 명시적으로 b = b // gcd return (gcd * a * b) def LCMargs(*args): currentLCM = None for i in args: currentLCM = LCM(i, currentLCM) return currentLCM def GCDargs(*args): currentGCD = None for i in args: currentGCD = GCD(i, currentGCD) return currentGCD
결과
94개의 댓글