Menu
Coddy logo textTech

Introduction

Coddy의 수학 수수께끼 코스 레슨 — 20개 중 10번째.

두 양의 정수 x와 y의 최대공약수(GCD)는 x와 y의 공통된 약수 중 가장 큰 수입니다.

예를 들어,

  • GCD(6, 15) = 3
  • GCD(7, 13) = 1
  • GCD(18, 30) = 6

최대공약수는 셋 이상의 양의 정수에 대해서도 모든 정수가 공유하는 가장 큰 공약수로 정의될 수 있습니다. 최대공약수가 1인 둘 이상의 양의 정수들은 서로소(relatively prime)라고 합니다. [Weisstein, Eric W. "Greatest Common Divisor." From MathWorld--A Wolfram Web Resource. https://mathworld.wolfram.com/GreatestCommonDivisor.html]

 

GCD를 구하기 위한 유클리드 알고리즘

최대공약수를 계산하기 위해 유클리드가 도입한 방법은, y > x인 두 양의 정수 x와 y가 주어졌을 때, x와 y의 공약수는 y - x와 x의 공약수와 같다는 사실에 기반합니다.

따라서, 두 양의 정수의 최대공약수를 계산하는 유클리드 방법은 더 큰 수를 두 수의 차이로 바꾸고, 두 수가 같아질 때까지 이 과정을 반복하는 것으로 구성됩니다. 이때 같아진 수가 바로 그들의 최대공약수입니다.

예시: GCD(6, 15) = GCD(6, 15 - 6) = GCD(6, 9) = GCD(6, 9 - 6) = GCD(6, 3) = GCD(6 - 3, 3) = GCD(3, 3) = 3

challenge icon

챌린지

쉬움

두 개의 정수로 이루어진 벡터 v를 입력받아, 해당 두 숫자의 최대공약수(GCD)를 구하는 파이썬 코드 gcd를 작성하세요.

v[0] <= v[1]임에 유의하세요.

직접 해보기

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include "solution.h"

int main() {
    int v[4096];
    int vn = 0;
    char line[65536];
    if (!fgets(line, sizeof(line), stdin)) line[0] = '\0';
    char* tok = strtok(line, " \t\r\n");
    while (tok) { v[vn++] = atoi(tok); tok = strtok(NULL, " \t\r\n"); }
    int r = gcd(v, vn);
    printf("%d\n", r);
    return 0;
}

수학 수수께끼의 모든 레슨

6Greatest common divisor

IntroductionEuclidean algorithmPhi function

9Binary numbers

Introduction