Вычисление факториала C++

#include <iostream>



template<uint64_t v>
struct Fact
{
    static constexpr uint64_t value = v * Fact<v - 1>::value;
};


template<>
struct Fact<0>
{
    static constexpr uint64_t value = 1;
};


int main()
{
    const int n = 2;
    std::cout << Fact<5 * n + 1>::value;
}

http://rextester.com/BHP62668

Вычисление факториала в compile-time?
А ты еще больший извращенец, чем я думал :)

Вычисление факториала в compile-time?

Да. Наверное, самая простая шаблонозадача
для compile-time вычислений.

А ты

А ТЫ, я смотрю, как был свиньей, так и остался. :)

еще больший извращенец

Это я свои шаблонокоды не показывал еще. :D

Наверное, самая простая шаблонозадача для compile-time вычислений.

Только такое решение подразумевает, что n — всегда константа. Хотя constexpr вроде-бы должен считаться в runtime, если во время компиляции это сделать невозможно.

Раньше тебя как-то не беспокоило нормально здоровое «тыкание», а сейчас почему-то начало. Видится как попытка зацепиться за что-то в процессе дискуса. И прекращай обзываться, это смотрится уж очень нелепо.

Хотя constexpr вроде-бы должен считаться в runtime, если во время компиляции это сделать невозможно.

Нет, он инициализируется только в compile-time.
Как возвращаемое значение функции — да,
в зависимости, например, от параметров
функции может быть вычислен как в compile-time,
так и в runtime. Код, для определения,
может ли функция быть рассчитана в рантайме:

#include <iostream>

#define CAN_BE_COMPILE_TIME_EVALUATE(FUNC, ...) \
[&]() {\
    auto foo________ = [&]() noexcept(false) {\
        return FUNC(__VA_ARGS__);\
    };\
    return noexcept(foo________()); \
}()


constexpr int foo(int x)
{
   int sum = 0;
   for (int i = 0; i < 10; ++i) {
      sum += i;
   }
   return sum;
}



int main()
{
    const int x1 = 20;
    int x2 = 10;
    constexpr bool b1 = CAN_BE_COMPILE_TIME_EVALUATE(foo, x1);
    constexpr bool b2 = CAN_BE_COMPILE_TIME_EVALUATE(foo, x2);
    std::cout << b1 << std::endl;
    std::cout << b2 << std::endl;
    constexpr int f = foo(x1);
    //constexpr int f = foo(x2);//error
}

Чтобы это работало во время компиляции,
необходима поддержка constexpr-лямбд из C++17,
ну и вариативные макросы под свой компилятор подогнать.
Делалось под GCC 7, т.к. другого компилятора с поддержкой
constexpr-лямбд я пока не видел.

Подробнее тут: http://www.cyberforum.ru/cpp-beginners/thread1896757.html

Раньше тебя как-то не беспокоило нормально здоровое «тыкание», а сейчас почему-то начало.

Видимо, раньше я этого не замечал.
Но всему же приходит конец, так ведь?
Ну и вначале недавней темы Вы мне «Выкали».
Я не против «тыканий», но сугубо обоюдных,
а незнакомым людям я тыкать не привык.

И прекращай обзываться, это смотрится уж очень нелепо.

Прекращаете «тыкать», я прекращаю обзываться. :)
Конечно, можно перейти на взаимные тычки
по обоюдному согласию, только надо ли? )))

То есть написать «ты» незнакомому человеку тебе кажется неприличным, а употреблять в его адрес разные богатые оскорбительные конструкции — в порядке вещей (при этом показательно употребляя обращение на «Вы»)?

Я просто не вижу ничего предрассудительного в том, чтобы не усложнять себе жизнь и переходить на «ты» с людьми, которые не годятся мне в дедушки или как минимум в отцы. Когда на такое обращение следует реакция «ты мне никто, чтобы тыкать» и прочее хамство, нет никакого желание покатать этому хамству.

В общем, предлагаю прекратить оффтопик. Я думаю, мы друг друга поняли.

#include <iostream>

uint64_t factorial(uint64_t n)
{
    uint64_t result = 1;
    for (uint64_t i = 1; i <= n; ++i) {
        result *= i;
    }
    return result;
}

int main()
{
    uint64_t n;
    std::cin >> n;
    std::cout << factorial(5 * n + 1) << std::endl;
    return 0;
}

Я просто не вижу ничего предрассудительного в том, чтобы не усложнять себе жизнь и переходить на «ты» с людьми, которые не годятся мне в дедушки или как минимум в отцы.

А мы со многими знакомыми общаемся на «Вы».
И даже используя имя и отчество.
В общении с заказчиками, тоже исключительно на «Вы».
Если заказчик будет мне «тыкать», я, скорее всего,
не буду с ним работать, т.к. это характерно для
не очень далеких людей, если при переговорах используют «тычки».

То есть написать «ты» незнакомому человеку тебе кажется неприличным

Именно. :)

а употреблять в его адрес разные богатые оскорбительные конструкции

В адрес невежд — да, хотя это тоже не есть хорошо.
Это всё равно, что лаять на собак, но хоть какое-то развлечение. :)

(при этом показательно употребляя обращение на «Вы»)?

Я, вроде бы, не забываю «тыкать» в таких сообщениях. :)

нет никакого желание покатать этому хамству.

Вот-вот, нет никакого желания общаться
с человеком, если он мне «тыкает».

В общем, предлагаю прекратить оффтопик. Я думаю, мы друг друга поняли.

Надеюсь, я донес до Вас своё мнение. :)
А так да, прекращаем.

Какой ты чувствительный мальчик, Томми.

Я привык к вежливости и взаимному уважению.
Видимо, Вам это не ведомо.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.