Другие языки программирования и технологии

Задание функции факториала в С++

Как задать факториал? Помогите, уже всю голову сломал, так не выходит: int fact (int n) { for (int n=1;;n++) for (int i=0;;i++) { if ((n-i)>=1); { return (n*(n-i)); } } } (при дополнительном условии в основной функции, ограничивающей функцию, зависящую от n)
Зачем менять переменную-аргумент n внутри самой процедуры? Ну нафига?

int result = 1;
for (int i=1; i < n; )
result *= ++i;
return result;
МФ
Миша Фомин
54 366
Лучший ответ
Тимур Жалалов Спасибо, успешно использовал ваш вариант из комментариев к первому ответу!
long fact(int n){long k=1; for(int i=1; i <= n; i++)k*=i; return k;}
Виктор Соснин
Виктор Соснин
56 928
Факториал N для целых чисел - это произведение ввех целых до N включительно. 0! = 1
Делай цикл и умножай. Но факториал очень быстро растет.
Если использовать целое без знака 32 бит, то больше 12! не вычислишь.
Если использовать целое без знака 64 бит, то больше 20! не вычислишь.
Если использовать double, то можно вычислить факториал до 170 с ограниченной точностью.

int main(int argc, char* argv[])
{
printf("unsigned int 32 bits\n");
unsigned int n, f;
for (n = 2, f = 1; n <= 13; ++n)
{
f *= n;
printf("%3u! = %u\n", n, f);
}

printf("\nunsigned int 64 bits\n");
unsigned __int64 f64;
for (n = 2, f64 = 1; n <= 21; ++n)
{
f64 *= n;
printf("%3u! = %I64u\n", n, f64);
}

printf("\ndouble\n");
double fd;
for (n = 2, fd = 1; n <= 171; ++n)
{
fd *= n;
printf("%3u! = %g\n", n, fd);
}

return 0;
}

Ничего красивого в этом решении нет
int fact(int n)
{
if(n==0||n==1) return 1;
return fact(n-1);
}
Незачем привлекать стек для решения простой задачи на цикл

Есть более красивое решение
N! = Gamma(N + 1); // Гамма функция для положительного целого дает факториал N
Иван Акиньшин
Иван Акиньшин
21 360
что-то вроде

int fact(int n)
{
int result = 1;
for(int i=2; i<=n; i++)
result = result * n;
return result;
}
Самое красивое решение это:
int fact(int n)
{
if(n==0||n==1) return 1;
return fact(n-1);
}
Александр Бирюков int fact(int n)
{
if(n==0||n==1) return 1;
return n*fact(n-1);
}
Александр Бирюков эта нехорошая система не дает исправить даже маленькую ошибку!
Сергей Мещеряков Замечательно. Читаю книгу по С++, там тоже такое решение автор предлагает. Класс.
Миша Фомин Перво-наперво логику программы нужно срочно менять: вы не собираетесь определять факториал для отрицательных значений, поэтому меняем на unsigned fact (unsigned n).
Тем самым решается проблема: n==0 || n==1 заменяется на n