• 약수: 어떤 수를 나누어떨어지게 하는 수
  • 배수: 어떤 수의 1, 2, 3, ...n 배하여 얻는 수
  • 공약수: 둘 이상의 수의 공통인 약수
  • 공배수: 둘 이상의 수의 공통인 배수
  • 최대 공약수(GCD. Greatest Common Divisor): 둘 이상의 공약수 중에서 최대인 수
  • 최소 공배수(LCM. Least Common Multiple): 둘 이상의 공배수 중에서 최소인 수

 

최대공약수를 유클리드 호제법을 이용해서 구해보자.

const GCD = (a, b) => {
  let r = a % b;
  if (r === 0) return b;
  return GCD(b, r);
}
GCD(160, 16) // 16

function gcd(m, n) {
  if (m % n === 0) return n;
  return gcd(n, m % n);
}
gcd(16, 24) // 8

매개변수를 넣는 순서는 상관없다. 큰 수로 작은 수를 나누면 나머지는 작은 수가 그대로 나오기 때문에 저절로 큰 수에서 작은 수를 나누게 된다. 

 

function gcd(m, n) {
  if (m % n === 0) return n;
  return gcd(n, m % n);
}
let GCD = gcd(16, 24)

let LCM = 16 * 24 / GCD // 48​

최소 공배수는 두 수를 곱한 후에 GCD로 나누면 구할 수 있다. 

 

 

약수를 O(log n)으로 구하는 방법

let num = 36;
//num의 제곱근을 구해준다
let sqrt = Math.floor(Math.sqrt(num)) //6
let divisor = []
for(let i = 1; i <= sqrt; i++){
  if(num % i === 0){
  //제곱근 이후에 있는 약수는 num 에서 해당 약수를 나눠주면 구할 수 있다.
    divisor.push(i, num / i)
  }
}
//중복을 제거하고 정렬을 해주면
divisor = [...new Set(divisor)]
divisor.sort((a, b) => a - b) //[ 1, 2, 3, 4, 6, 9, 12, 18, 36 ]

'학습' 카테고리의 다른 글

express 미들웨어 CORS - configuration options  (0) 2021.10.21
useHistory 사용법  (0) 2021.10.15
Redux 예제  (0) 2021.10.05
REST API  (0) 2021.09.04
마크다운 작성법  (0) 2021.09.04