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/w/cpp/numeric/lcm