numeric_lcm

numeric_lcm (최소공배수)

std::lcm은 정수 m과 n의 최소공배수를 계산하는 함수예요. C++17부터 사용할 수 있어요.

출처: cppreference

본문

<numeric> 헤더에 정의되어 있고, 시그니처는 다음과 같아요.

template< class M, class N >
constexpr std::common_type_t<M, N> lcm( M m, N n );

(since C++17)

정수 m과 n의 최소공배수를 계산해요.

M 또는 N이 정수 타입이 아니거나, 둘 중 하나가 (cv 한정된) bool이면 프로그램은 ill-formed예요.

|m|, |n| 또는 |m|과 |n|의 최소공배수를 std::common_type_t<M, N> 타입의 값으로 표현할 수 없으면 동작은 정의되지 않아요.

매개변수 (Parameters)

  • m, n — 정수 값

반환값 (Return value)

m 또는 n이 0이면 0을 반환해요. 그 외에는 |m|과 |n|의 최소공배수를 반환해요.

예외 (Exceptions)

예외를 던지지 않아요.

참고 (Notes)

피처 테스트 매크로 표준 기능
__cpp_lib_gcd_lcm 201606L (C++17) std::gcd, std::lcm

예제 (Example)

이 코드를 실행해 봐요.

#include <iostream>
#include <numeric>

#define OUT(...) std::cout << #__VA_ARGS__ << " = " << __VA_ARGS__ << '\n'

constexpr auto lcm(auto x, auto... xs)
{
    return ((x = std::lcm(x, xs)), ...);
}

int main()
{
    constexpr int p{2 * 2 * 3};
    constexpr int q{2 * 3 * 3};
    static_assert(2 * 2 * 3 * 3 == std::lcm(p, q));
    static_assert(225 == std::lcm(45, 75));

    static_assert(std::lcm( 6,  10) == 30);
    static_assert(std::lcm( 6, -10) == 30);
    static_assert(std::lcm(-6, -10) == 30);

    static_assert(std::lcm( 24, 0) == 0);
    static_assert(std::lcm(-24, 0) == 0);

    OUT(lcm(2 * 3, 3 * 4, 4 * 5));
    OUT(lcm(2 * 3 * 4, 3 * 4 * 5, 4 * 5 * 6));
    OUT(lcm(2 * 3 * 4, 3 * 4 * 5, 4 * 5 * 6, 5 * 6 * 7));
}

출력:

lcm(2 * 3, 3 * 4, 4 * 5) = 60
lcm(2 * 3 * 4, 3 * 4 * 5, 4 * 5 * 6) = 120
lcm(2 * 3 * 4, 3 * 4 * 5, 4 * 5 * 6, 5 * 6 * 7) = 840

더 알아보기 (Learn more)

cppreference