Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
 Аватар для zemskyi
61 / 61 / 16
Регистрация: 18.09.2014
Сообщений: 521

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

18.09.2014, 19:16. Показов 3979. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.09.2014, 19:16
Ответы с готовыми решениями:

Обьясните почему так работает Yield
function values() { $j = 1; for($i=0; $i&lt;4; $i++) { yield $j = $j + $i; } }

Почему так странно работает калькулятор
Здраствуйте, я сегодня решил взяться за C++, решил написать самое простое, калькулятор: #include &lt;cstdlib&gt; #include...

Почему мой div так странно позиционируется?
У меня есть страница с дивами, в аттаче есть скриншот. У меня 5 основных блоков (AAA, BBB, CCC, Community, News), которые в лежиме float:...

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

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

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



Добавлено через 2 минуты
Да и еще с использованием рекурсии может быть проблемы - переполнение стека, поэтому лучше не использовать либо использовать осторожно.
спасибо, запомню на будущее))
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.09.2014, 19:32
Насчет примера gmp https://www.cyberforum.ru/blog... og488.html
0
 Аватар для zemskyi
61 / 61 / 16
Регистрация: 18.09.2014
Сообщений: 521
18.09.2014, 19:38  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Насчет примера gmp https://www.cyberforum.ru/blog... og488.html
угу, сенкс)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.09.2014, 19:38
Помогаю со студенческими работами здесь

Почему VBA так странно делает сравнение значений?
Всем привет, У меня возник такой вопрос. В ячейке A1 высвечивается #ИМЯ?. Я создал такую программку: Sub msgboxerror() On Error...

Почему так странно обрабатывается запрос по селекции дат?
У меня есть поле dataTime в нем хранятся данные 14.01.2020 10:08 14.01.2020 10:10 14.01.2020 10:10 14.01.2020 10:10 14.01.2020...

Почему так странно срабатывает селекция дат в запросе?
Делаю запрос к представлению код запроса SELECT orders_view.*, orders_view.data FROM orders_view WHERE orders_view.data...

Не могу понять почему так странно выполняется элемент кода
if (d.key.code == Mouse::Left) { g = k; if ((x = 1) &amp;&amp; (y = 1)) { board = 'x'; } if ((x = 2) &amp;&amp; (y =...

Почему так странно находятся углы в сферической системе координат
Добрый вечер! Вот краткая вырезка, которая меня и интересует. Всё по инфе из WIKI СФЕРИЧЕСКИЕ КООРДИНАТЫ. 1 Есть координаты точки и...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru