개발 지식/알고리즘

[백준] 2609 최대공약수와 최소공배수

트리맨스 2019. 3. 24. 12:21
반응형

문제 : 두 개의 자연수를 입력받아 최대공약수와 최소공배수를 출력하는 프로그램을 작성하시오.


최대공약수와 최소공배수를 출력하는 문제입니다.

최대공약수의 정의는 두 수를 나누어 나머지가 0이 되게 하는 수 중 가장 큰 수이고,

최소공배수는 두 수의 공통의 배수 중 가장 작은 수를 의미합니다.


저는 유클리드 호제법이라는 알고리즘을 사용할 것 입니다.

예를 들어 12와 40의 최대공약수를 구한다면,


40%12=4  //피연산자와 나머지를 

12%4=0   //연산자와 피연산자로 이동해줍니다. 그리고 0이 될때까지 이 과정을 반복합니다.



나머지가 0이 될 때, 그 때의 피연산자가 최대공약수 입니다.

그럼 최소공배수는 어떻게 구할까요? 간단합니다. 두 수의 곱/최대공약수 입니다.


이걸 이용하면 계산을 반복할 필요도 없고 연산 시간도 줄어듭니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>  /* 유클리드 호제법 알고리즘 사용*/  
 
int main()
{
    int num,k,j=0
    int arr[100000];    
    
 
    scanf("%d %d",&arr[0],&arr[1]);
    if(arr[0]<arr[1])   //맨 왼쪽에 더 큰 수 입력   
    {
        k=arr[1]; arr[1]=arr[0]; arr[0]=k;
    }
    while(1)  //오른쪽으로 가면서 나머지 입력  
    {
        arr[j+2]=arr[j]%arr[j+1]; 
        if(arr[j+2]==0)
        {
            break;
        }
        j++
    }
    printf("%d\n%d",arr[j+1],arr[0]*(arr[1]/arr[j+1]));     
}
cs


반응형