Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
zemskyi
61 / 61 / 16
Регистрация: 18.09.2014
Сообщений: 521
#1

Обьясните, почему код так странно считает факториалы - C++

18.09.2014, 19:16. Просмотров 441. Ответов 6
Метки нет (Все метки)

Добрый день, ув. форумчане. Есть код, считающий факториалы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdio.h"
#include "windows.h"
 
__int64 factorial(__int64 n)
{
    return (n == 0 ? 1 : n*factorial(n - 1));
}
 
int main(int argc, char* argv[])
{
    for (int n = 0; n <= 100; n++)
        printf("%d! = %I64d\n", n, factorial(n));
    system("pause");
    return 0;
}
Почему он выдает такие результаты (минусовые результаты, которых в принципе быть не может и нули)???:

1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
21! = -4249290049419214848
22! = -1250660718674968576
23! = 8128291617894825984
24! = -7835185981329244160
25! = 7034535277573963776
26! = -1569523520172457984
27! = -5483646897237262336
28! = -5968160532966932480
29! = -7055958792655077376
30! = -8764578968847253504
31! = 4999213071378415616
32! = -6045878379276664832
33! = 3400198294675128320
34! = 4926277576697053184
35! = 6399018521010896896
36! = 9003737871877668864
37! = 1096907932701818880
38! = 4789013295250014208
39! = 2304077777655037952
40! = -70609262346240000
41! = -2894979756195840000
42! = 7538058755741581312
43! = -7904866829883932672
44! = 2673996885588443136
45! = -8797348664486920192
46! = 1150331055211806720
47! = -1274672626173739008
48! = -5844053835210817536
49! = 8789267254022766592
50! = -3258495067890909184
51! = -162551799050403840
52! = -8452693550620999680
53! = -5270900413883744256
54! = -7927461244078915584
55! = 6711489344688881664
56! = 6908521828386340864
57! = 6404118670120845312
58! = 2504001392817995776
59! = 162129586585337856
60! = -8718968878589280256
61! = 3098476543630901248
62! = 7638104968020361216
63! = 1585267068834414592
64! = -9223372036854775808
65! = -9223372036854775808
66! = 0
67! = 0
68! = 0
69! = 0
70! = 0
71! = 0
72! = 0
73! = 0
74! = 0
75! = 0
76! = 0
77! = 0
78! = 0
79! = 0
80! = 0
81! = 0
82! = 0
83! = 0
84! = 0
85! = 0
86! = 0
87! = 0
88! = 0
89! = 0
90! = 0
91! = 0
92! = 0
93! = 0
94! = 0
95! = 0
96! = 0
97! = 0
98! = 0
99! = 0
100! = 0
Для продолжения нажмите любую клавишу . . .

В тоже время этот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include "locale.h"
#include "windows.h"
using namespace std;
 
double fact(int N)
{
    if (N < 0) // если пользователь ввел отрицательное число
        return 0; // возвращаем ноль
    if (N == 0) // если пользователь ввел ноль,
        return 1; // возвращаем факториал от нуля - не удивляетесь, но это 1 =)
    else // Во всех остальных случаях
        return N * fact(N - 1); // делаем рекурсию.
}
 
int main()
{
    int N;
    setlocale(0, ""); // Включаем кириллицу
    cout << "Введите число для вычисления факториала: ";
    cin >> N;
    cout << "Факториал для числа " << N << " = " << fact(N) << endl << endl; // fact(N) - функция для вычисления факториала.
    system("pause");
    return 0;
}
считает все нормально. Почему если тип double (ну или long double), то считает факториалы правильно, а если другие - нет?

Заранее спасибо.

P.S. все коды найдены на просторах сети
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2014, 19:16
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Обьясните, почему код так странно считает факториалы (C++):

Почему так странно работает калькулятор
Здраствуйте, я сегодня решил взяться за C++, решил написать самое простое,...

Почему так странно находятся углы в сферической системе координат
Добрый вечер! Вот краткая вырезка, которая меня и интересует. Всё по инфе из...

Почему не правильно считает что не так?
В данной программе я пытаюсь найти процентное отношение ассоциативного массива ...

Работаю с файлом *.txt. Прога ведет себя странно если последняя строка файла пуста. Почему так?
Добрый день! Помогите пожалуйста с небольшой проблемой. Что хотел сделать:...

Бинарный код: почему так?
Бинарный код числа 5 равен 111001. Не пойму, почему 111001 вместо 001001? Что...

Почему код не работает хотя ошибок нет? Что-то не так с выделением памяти?
#include &lt;math.h&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt;...

6
Avazart
Эксперт С++
7681 / 5590 / 543
Регистрация: 10.12.2010
Сообщений: 25,073
Записей в блоге: 17
18.09.2014, 19:19 #2
Переполнение вероятно... "не влазиет" в тип
Факториал числа слишком возрастает получается слишком большое число, которое невозможно сохранить в стандартных типах данных.
0
zemskyi
61 / 61 / 16
Регистрация: 18.09.2014
Сообщений: 521
18.09.2014, 19:25  [ТС] #3
Цитата Сообщение от Avazart Посмотреть сообщение
Переполнение вероятно... "не влазиет" в тип
Факториал числа слишком возрастает получается слишком большое число, которое невозможно сохранить в стандартных типах данных.
хорошо, я это объясняет откуда нули. а почему некоторые числа отрицательные???
0
Avazart
Эксперт С++
7681 / 5590 / 543
Регистрация: 10.12.2010
Сообщений: 25,073
Записей в блоге: 17
18.09.2014, 19:28 #4
Читай про длинную арифметику и реализовывай, либо используй готовые либы типа gmp, mpir, NTL идр.

Добавлено через 1 минуту
Цитата Сообщение от zemskyi Посмотреть сообщение
а почему некоторые числа отрицательные???
Цитата Сообщение от Avazart Посмотреть сообщение
Переполнение вероятно...
Добавлено через 2 минуты
Да и еще с использованием рекурсии может быть проблемы - переполнение стека, поэтому лучше не использовать либо использовать осторожно.
0
zemskyi
61 / 61 / 16
Регистрация: 18.09.2014
Сообщений: 521
18.09.2014, 19:29  [ТС] #5
Цитата Сообщение от Avazart Посмотреть сообщение
Читай про длинную арифметику и реализовывай, либо используй готовые либы типа gmp, mpir, NTL идр.

Добавлено через 1 минуту



Добавлено через 2 минуты
Да и еще с использованием рекурсии может быть проблемы - переполнение стека, поэтому лучше не использовать либо использовать осторожно.
спасибо, запомню на будущее))
0
Avazart
Эксперт С++
7681 / 5590 / 543
Регистрация: 10.12.2010
Сообщений: 25,073
Записей в блоге: 17
18.09.2014, 19:32 #6
Насчет примера gmp http://www.cyberforum.ru/blogs/131347/blog488.html
0
zemskyi
61 / 61 / 16
Регистрация: 18.09.2014
Сообщений: 521
18.09.2014, 19:38  [ТС] #7
Цитата Сообщение от Avazart Посмотреть сообщение
угу, сенкс)
0
18.09.2014, 19:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2014, 19:38
Привет! Вот еще темы с решениями:

Обьясните почему не работает
Я новичек, помогите разобраться. #include &lt;iostream&gt; #include &lt;windows.h&gt;...

Обьясните что не так не могу понять
программа должна менять цвет bmp файла но при запуске выдает ошибку что 2...

Обьясните, почему данная конструкция неправильна?
Обьясните, почему такая конструкция неправильна. class Base { \\......

Обьясните код
Ребят помогите с обьяснением этой проги !!! #include &lt;iostream&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru