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

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

18.09.2014, 19:16. Просмотров 460. Ответов 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++, решил написать самое простое,...

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

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

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

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

6
Avazart
Эксперт С++
7718 / 5627 / 549
Регистрация: 10.12.2010
Сообщений: 25,333
Записей в блоге: 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
Эксперт С++
7718 / 5627 / 549
Регистрация: 10.12.2010
Сообщений: 25,333
Записей в блоге: 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
Эксперт С++
7718 / 5627 / 549
Регистрация: 10.12.2010
Сообщений: 25,333
Записей в блоге: 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;math.h&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt;...

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

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


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

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

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