[Alg] GCD 계산 알고리즘

2022. 11. 5. 13:08·Algorithm

유클리드 호제법 (Euclidean algorithm)

2개의 자연수의 최대 공약수를 구하는 알고리즘으로 명시적으로 기술된 가장 오래된 알고리즘이다.
a > b 이고 a % b = r 이라 할 때, a와 b의 최대 공약수는 b 와 r의 최대 공약수와 같고 이와 같은 과정을
하나의 수가 0이 될 때까지 반복하면 나머지 한 수가 최대 공약수가 된다는 법칙.

def gcd(a,b):
    while a != 0 and b != 0:
        if a > b:
            a %= b
        elif a < b:
            b %= a
        else:
            b = 0
    return a + b



재귀를 활용하여 gcd 함수 구현하기

def gcd(a,b):
    if a == 0 or b == 0: return a+b
    elif a > b: return gcd(a-b,b)
    else: return gcd(b-a, a)
def lcm(a,b): return int(a*b/gcd(a,b))




BOJ_9417 : 최대 GCD

문제
정수 M개가 주어졌을 때, 모든 두 수의 쌍 중에서 가장 큰 최대공약수 찾는 프로그램을 작성하시오.

입력
첫째 줄에 테스트 케이스의 개수 N (1 < N < 100)이 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 양의 정수 M (1 < M < 100)개가 주어진다. 모든 수는 -231보다 크거나 같고, 231 -1보다 작거나 같다.

출력
각 테스트 케이스마다, 입력으로 주어진 수의 모든 두 수의 쌍의 최대공약수 중 가장 큰 값을 출력한다.


def gcd(a,b):
    while a != 0 and b != 0:
        if a > b:
            a %= b
        elif a < b:
            b %= a
        else:
            b = 0
    return a + b

import sys

n = int(input())
inputs = [list(map(int,sys.stdin.readline().split())) for i in range(n)]
outputs = []

for i in range(n):
    max = 0
    size = len(inputs[i])
    if size == 1:
        continue
    for a in range(1,size):
        for b in range(size-a):
            if gcd(inputs[i][b],inputs[i][b+a]) > max:
                max = gcd(inputs[i][b],inputs[i][b+a])
    outputs.append(max)

for i in outputs:
    print(i)





리스트에 있는 모든 수의 모든 두 쌍을 비교하는 방법

1. 리스트의 size를 len(list)로 먼저 구한다.
2. for - range(1,size)문으로 가능한 간격의 범위를 돌린다.
예) list = [1, 2, 3, 4]일 경우 가능한 간격의 범위는 1칸, 2칸, 3칸
3. 1칸인 경우 list[0]에서 list[2]까지 for문을 돌리면서 1칸 뒤와 비교한다.
4. 2칸인 경우에도 마찬가지로 list[0]에서 list[1]까지 for문을 돌리며 2칸 뒤와 비교한다.
5. 위의 과정을 반복하면 리스트에 있는 모든 수의 모든 두 쌍을 비교할 수 있다.

'Algorithm' 카테고리의 다른 글
  • [Alg] 위상 정렬 (Topology Sort)
  • [Alg] 서로소 집합 알고리즘 (Disjoint Sets Algorithm)
  • [Alg] DFS / BFS
  • [Alg] 소수(Prime Number)인지 판별하는 방법
vysryoo
vysryoo
  • vysryoo
    vysryoo
    vysryoo
  • 전체
    오늘
    어제
    • 분류 전체보기 (129)
      • Python (20)
      • Data structure (12)
      • Algorithm (14)
      • Operating system (18)
      • Programming language theory (12)
      • Computer architecture (6)
      • Softeware engineering (8)
      • Multicore (2)
      • Data Base (3)
      • Problem solving (24)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
vysryoo
[Alg] GCD 계산 알고리즘
상단으로

티스토리툴바