Программы ниже вычисляет LCM из 2-х номеров, ожидаемый выход 216 с входом 54 и 24, но я получаю 57.Вычислить LCM 2 чисел с помощью шаблонов
Может кто-то помочь с тем же, и дайте мне знать, что случилось с фрагментом кода ниже.
/* ***********/
*** LCM ******/
/**************/
template<bool cond, int V1, int V2>
struct IfCond
{
enum
{
value = V1
};
};
template<int V1, int V2>
struct IfCond<0, V1, V2>
{
enum
{
value = V2
};
};
template<int V1, int V2>
struct findMax
{
enum
{
result = V1 > V2,
value = IfCond<result, V1, V2>::value
};
};
template<int V1, int V2, int max>
struct findLCM
{
enum
{
result = findLCM<max % V1, max % V2, max+1>::result
};
};
template<int V2, int max>
struct findLCM<0, V2, max>
{
enum
{
result = findLCM<0, max % V2, max+1>::result
};
};
template<int V1, int max>
struct findLCM<V1, 0, max>
{
enum
{
result = findLCM<max % V1, 0, max+1>::result
};
};
template<int max>
struct findLCM<0, 0, max>
{
enum
{
result = max
};
};
int main()
{
std::cout<< findLCM<54, 24, findMax<54, 24>::value>::result << std::endl;
}
Какой алгоритм вы используете? – max66
Если вы разворачиваете шаблоны вручную, они идут: 'findLCM <54, 24, :: value >> = findLCM <54,24,54> => findLCM <54% 54, 54% 24, 55> == findLCM <0,6,55> => findLCM <0,55%6, 56> == findLCM <0,1,56> => findLCM <0,56%1, 57> == findLCM <0,0,57> =>=> 57 Две проблемы, которые я вижу: вы используете алгоритм Эйлера для GCD, и у вас есть это (слегка) неправильно. –
, пожалуйста, выберите более описательное название – user463035818