본문 바로가기
쿤즈 Dev/C

[C언어 문제] 두 수의 최소공배수(LCM) 구하기

by :)Koon 2021. 5. 6.

지난 C언어 문제에서는 두 수의 최대공약수를 구하는 문제를 풀어보았습니다. 최대공약수가 있다면 최소공배수도 구해봐야겠죠?

 

이번 포스팅에서는 두 수의 최소공배수를 구하는 방법을 알아보겠습니다.


C언어 문제. 두 수의 최소공배수 구하기

화면에 다음과 같이 출력되도록 프로그래밍하시오.

두 양의 정수를 입력하시오 : 6 9
최소공배수=18

조건 1. 반복문(for, while, do ... while)을 이용하기

조건 2. 조건문(if) 이용하기

 

* 프로그래밍 의도

최소공배수를 구하는 방법을 프로그래밍으로 옮길수 있는가?

두 양의 정수를 입력받을 수 있는가?

반복문을 사용할 수 있는가?

조건문을 사용할 수 있는가?

 

* 문제 해결을 위한 글

2020.08.06 - [쿤즈 Dev/C] - [C언어] 표준입력 표준출력 사용하기 (첫 프로그래밍 시작!)

2020.08.07 - [쿤즈 Dev/C] - [C언어] 연산자의 종류에 대해서 알아보자

2020.08.25 - [쿤즈 Dev/C] - [C언어] 반복문의 시작! - for 구문

2020.09.14 - [쿤즈 Dev/C] - [C언어] 반복문 두 번째 - while 구문

2020.09.15 - [쿤즈 Dev/C] - [C언어] 반복문 세 번째 - do while

2020.08.10 - [쿤즈 Dev/C] - [C언어] 조건문을 사용해서 분기시켜보자(1) - if 조건문!

 


C언어 문제 풀이

작성된 프로그래밍은 정답이 아닙니다. 프로그래밍 소스에 대해 정답은 없습니다. 다양한 방법으로 프로그래밍이 가능하며 한 가지 예일 뿐입니다.

소스코드 1. lcm_while.c

#include <stdio.h>

int main() {
    int num1, num2, lcm;
    
    printf("두 양의 정수를 입력하시오 : ");
    scanf("%d %d", &num1, &num2);
    
    // 1. 삼항 연산자를 이용해서 두 양의 정수중 큰 값을 lcm에 저장
    lcm = num1 > num2 ? num1 : num2;
    
    // 2. lcm이 두 수로 나누어 떨어지면 반복 종료.
    while(1) {
        if(lcm % num1 == 0 && lcm % num2 == 0)
            break;
        lcm++;
    }
    
    printf("최소공배수 = %d\n", lcm);
    return 0;
}

 

* 프로그래밍 의도 파악

최소공배수를 구하는 방법을 프로그래밍으로 옮길 수 있는가?

최소공배수를 모른다 해도 인터넷을 검색해서 찾을 수 있습니다. 이렇게 찾은 최소공배수 구하는 방법을 이용해서 그대로 프로그래밍을 옮길 수 있어야 합니다. 처음에는 힘들겠지만 반복적인 연습을 하다 보면, 그리고 C언어에 익숙해지면 충분히 하실 수 있습니다.

 

두 수의 최소공배수란 양의 정수인 두 수의 각각의 배수들이 존재합니다. 3과 5라면 3, 6, 9, 12..., 그리고 5, 10, 15, 20,... 과 같이 말이죠. 이때 두 수의 공통된 배수가 존재합니다. 3과 5의 공배수는 15, 30, 45,... 이때 공배수 중 가장 작은 수를 최소 공배수라 합니다.

 

그렇다면 이 두 수의 최소공배수를 구하는 방법이 무엇이 있을까요? 공배수를 구하는 방법은 두 가지입니다. 

첫 번째는 두 수의 공배수를 찾고 공통된 최솟값을 찾는 것입니다. 공배수를 찾는 방법은 반대로 어떤 수가 두 수로 나누어 떨어진다는 이야기입니다. 공통적으로 나누어 떨어지는 최솟값을 찾을 수 있습니다.

 

두 번째는 최소공배수의 규칙입니다. 최소공배수는 약수들의 곱으로 구할 수 있습니다. 최대 공약수와 나머지 약수들을 모두 곱한 값이 최소공배수가 됩니다.

 

위 예제는 첫 번째 방법을 이용해보았습니다.

 

두 양의 정수를 입력받을 수 있는가?

두 정수를 입력받기 위한 정수형 (int) 변수가 필요합니다. 정수형 변수는 num1, num2를 사용하였고 최소공배수를 저장하기 위한 정수형 변수 lcm을 선언하였습니다.

 

이 두 정수는 모두 사용자로부터 받도록 합니다. 두 정수를 받아서 각각 num1과 num2에 저장합니다. 이렇게 저장하는 함수는 scanf() 함수이며 Windows에서 사용하는 visual studio에서는 scanf_s()와 같은 함수로 대체해서 사용할 수 있습니다.

 

반복문을 사용할 수 있는가?

어떤 수를 찾기 위해서 규칙적으로 비교하기 위해서는 반복문이 필요합니다. 입력받은 두 수중 더 큰 수를 lcm 변수에 저장합니다. 그리고 이 변수를 1씩 증가시키면서 두 수가 각각 lcm과 나누어 떨어지는 첫 번째 수를 최소공배수로 찾을 수 있습니다.

 

조건문을 사용할 수 있는가?

반복문을 시용하면서 lcm이 각각 num1과 num2로 나누어 떨어지는 수를 찾기 위해서는 산술 연산자와 조건문이 필요합니다. 산술 연산자는 나머지를 구하는 % 연산자를 사용합니다. 또한 비교 연산자(==)를 사용해서 두 수가 같은지 확인합니다.

 

비교 연산자를 잘못 사용해서 =로 사용했다면 다른 결과가 나오게 되니 주의하시기 바랍니다.

 

추가적으로 두 수가 모두 나누어 떨어져야 합니다. lcm % num1과 lcm % num2가 모두 성립해야 하기 때문에 논리 연산자 &&를 사용했습니다. 만약 논리 연산자를 사용하지 않는다면 중첩 if문을 사용해서 비교할 수도 있습니다.


이번 포스팅에서는 C언어를 이용해서 최소공배수를 구하는 방법을 알아보았습니다. 우리가 알고 있는 수학 혹은 산수를 이용해서 모두 프로그래밍으로 만들어 보는 것이 중요합니다. 도움이 되셨으면 좋겠습니다. 이상입니다.

댓글