std::lcm
Определён в заголовочном файле <numeric> | ||
|---|---|---|
template< class M, class N > constexpr std::common_type_t<M, N> lcm( M m, N n ); | (начиная с C++17) |
Вычисляет наименьшее общее кратное целых чисел m и n.
Если M или N не является целочисленным типом либо если любой из них является (возможно, с квалификаторами cv) bool, программа некорректна.
Поведение не определено, если |m|, |n| или наименьшее общее кратное |m| и |n| не представимо в виде значения типа std::common_type_t<M, N>.
Параметры
| m, n | - | целочисленные значения |
Возвращаемое значение
Если m или n равно нулю, возвращает ноль. В противном случае возвращает наименьшее общее кратное |m| и |n|.
Исключения
Не выбрасывает исключений.
Примечания
| Макрос проверки поддержки возможности | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_gcd_lcm | 201606L | (C++17) |
std::gcd, std::lcm |
Пример
#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
См. также
|
(C++17) | вычисляет наибольший общий делитель двух целых чисел (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/numeric/lcm