Другие языки программирования и технологии
Задание функции факториала в С++
Как задать факториал? Помогите, уже всю голову сломал, так не выходит: 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;
int result = 1;
for (int i=1; i < n; )
result *= ++i;
return result;
Тимур Жалалов
Спасибо, успешно использовал ваш вариант из комментариев к первому ответу!
long fact(int n){long k=1; for(int i=1; i <= n; i++)k*=i; return k;}
Факториал 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
Делай цикл и умножай. Но факториал очень быстро растет.
Если использовать целое без знака 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
что-то вроде
int fact(int n)
{
int result = 1;
for(int i=2; i<=n; i++)
result = result * n;
return result;
}
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 fact(n-1);
}
Александр Бирюков
эта нехорошая система не дает исправить даже маленькую ошибку!
Сергей Мещеряков
Замечательно. Читаю книгу по С++, там тоже такое решение автор предлагает. Класс.
Миша Фомин
Перво-наперво логику программы нужно срочно менять: вы не собираетесь определять факториал для отрицательных значений, поэтому меняем на unsigned fact (unsigned n).
Тем самым решается проблема: n==0 || n==1 заменяется на n
Тем самым решается проблема: n==0 || n==1 заменяется на n
Похожие вопросы
- Факториал парных чисел в С++ (VS 2010)
- Помогите с Си. Вопрос по заданию (насчет типизированной функции, которая должна возвращать массив)
- Что такое факториал? Помогите пожалуйсто с синтаксисом С++.
- Факториал tasm. Нужно вычислить факториал (не меньше 300!) и вывести результат на дисплей. Заранее спасибо.
- Факториалы в паскале???
- нужно написать программку на ассемблере, к-рая считает факториал числа n
- Помогите, пожалуйста, с нахождением факториала. Язык Си.
- Вычисление суммы с факториалом в С++?
- На сколько нулей оканчивается факториал заданного числа
- Ассемблер рекурсивная процедура. вычисление факториала, в чем проблемма программы? в отладчике она зацикливается.