Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Denisios
0 / 0 / 0
Регистрация: 17.10.2012
Сообщений: 21
#1

Задача с факториалами - C++

07.11.2013, 18:29. Просмотров 690. Ответов 11
Метки нет (Все метки)

Здравствуйте. Помогите пожалуйста. Нужно узнать какого размера можно вычислить факториал в типе данных long int и unsigned long int
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2013, 18:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задача с факториалами (C++):

Задача с факториалами. - C++
Есть задачи, помогите додумать пожалуйста. #include <iostream> #include <cmath> #include <cstdlib> using namespace std; ...

С факториалами - C++
Задача такова: Вычислить для заданного целого n\geq 0 : (2n+1)!!=1*3*5...*(2k+1); (2n)!!=1*2*4*6*...*(2n); n!!, где...

Сумма с факториалами - C++
Задание : с заданной точностью е рассчитать 1+1/1!+1/2!+1/3!+... программе не нравится часть с факториалами в самом начале #include...

Найти остаток от деления выражения с факториалами на заданное число - C++
По заданным числам n,m,К найти остаток от деления n!/(m!(n-m)!) на К. Ограничения 5<=n<=100000 3<=m<=n-3 10<=K<=2000 например ...

Даны два натуральных числа. Определить сколько чисел на отрезке между ними являются факториалами - C++
Даны два натуральных числа. Определить сколько чисел на отрезке между ними являются факториалами. Пожалуйста помогите написать программу....

задача с факториалами - Turbo Pascal
Студенты изучают 7 предметов. Сколькими способами можно составить расписание на один день, если в день следует устанавливать не менее двух...

11
ZaMaZaN4iK
Мой лучший друг-отладчик!
164 / 164 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
07.11.2013, 19:03 #2
всё очень просто : ограничения на типы данных находятся в файле <climits>. Вызываете нужные вам константы и путём несложного цикла находите максимальное значение факториала для каждого типа данных
0
ПерС
371 / 287 / 89
Регистрация: 05.11.2013
Сообщений: 820
Записей в блоге: 5
Завершенные тесты: 1
07.11.2013, 19:07 #3
Цитата Сообщение от Denisios Посмотреть сообщение
Здравствуйте. Помогите пожалуйста. Нужно узнать какого размера можно вычислить факториал в типе данных long int и unsigned long int
Размеры максимального long int и unsigned long int зависят от компилятора
если 4 байта, то макс.числа =
без знака 0xFFFFFFFF = 4 294 967 295
со знаком 0x7FFFFFFF = 2 147 483 647 = MAXLONGINT
Теперь вычисли, не знаю как те надо, вот перебором с контролем переполнения
C++
1
2
3
4
5
6
7
long int n=0x7FFFFFFF;
long int i=1,p=1;
for (; i<=n; i++) {
 p*=i;
 if (p<0) break;
}
//i = 17 ответ для long int
Хм, наверно, i-1 = ответ точнее
Потом аналогично для unsigned long int
0
newbie666
Заблокирован
07.11.2013, 19:12 #4
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
ограничения на типы данных находятся в файле <climits>. Вызываете нужные вам константы и путём несложного цикла находите максимальное значение факториала для каждого типа данных
тут не всё так просто
long int и unsigned long int (int можно ни писать) имеют размерность в 4 байта (в современных системах, раньше Int мог быть и 2-х байтным).
В 4 байта помещается:
short: -32768..32767
long: -2147483648..2147483647
или для без знакового:
unsigned long: 0..4294967295
Даже для просчёта факториала 2147483647 стандартный калькулятор виндовс уже не сгодится и в С++ даже не поможет long long. Так тут речь идёт о длинной арифметике, а это совсем другая песня и далеко не просто.
0
mat_for_c
161 / 156 / 33
Регистрация: 26.04.2013
Сообщений: 704
Завершенные тесты: 2
07.11.2013, 19:17 #5
Цитата Сообщение от ПерС Посмотреть сообщение
Потом аналогично для unsigned long int
только там отрицательных значений нет )))

Добавлено через 2 минуты
Цитата Сообщение от newbie666 Посмотреть сообщение
для просчёта факториала 2147483647
а его и не надо считать. надо найти максимальный факториал, попадающий в область значений типа.
0
newbie666
Заблокирован
07.11.2013, 19:29 #6
Цитата Сообщение от ПерС Посмотреть сообщение
какого размера можно вычислить факториал в типе данных long int и unsigned long int
а ну тогда ответ и на первый вариант и на второй число 12
0
Байт
Эксперт C
16354 / 10630 / 1592
Регистрация: 24.12.2010
Сообщений: 20,279
07.11.2013, 19:38 #7
Цитата Сообщение от ПерС Посмотреть сообщение
for (; i<=n; i++) {
*p*=i;
*if (p<0) break;
}
ИМХО, такой подход может не сработать. При умножении p может "перепрыгнуть" через отрицательную область, даст >0, хотя результат будет неверным. Могу предложить заменить умножение несколькими сложениями
C++
1
2
3
4
5
6
7
8
9
for (; i<=n; i++) {
 for(q=0,j=0; j<i; j++) {
   q+= p;
   if (q<0) dreak;
 }
 if (j<i) break;
 p = q;
}
cout << i-1;
1
salam
165 / 146 / 14
Регистрация: 10.07.2012
Сообщений: 738
07.11.2013, 20:10 #8
Цитата Сообщение от newbie666 Посмотреть сообщение
для просчёта факториала 2147483647 стандартный калькулятор виндовс уже не сгодится
вы хотя бы примерно себе представляете, как растет эта функция?
0
newbie666
Заблокирован
07.11.2013, 20:15 #9
Цитата Сообщение от salam Посмотреть сообщение
вы хотя бы примерно себе представляете, как растет эта функция?
этому учат в ещё в школе

Добавлено через 1 минуту
вы хотите предоставить результат n! 2147483647 ? в студию результат ))))))
0
ПерС
371 / 287 / 89
Регистрация: 05.11.2013
Сообщений: 820
Записей в блоге: 5
Завершенные тесты: 1
08.11.2013, 14:21 #10
Цитата Сообщение от mat_for_c Посмотреть сообщение
только там отрицательных значений нет )))
Почитай, что такое переполнение
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
08.11.2013, 14:28 #11
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
всё очень просто : ограничения на типы данных находятся в файле <climits>. Вызываете нужные вам константы и путём несложного цикла находите максимальное значение факториала для каждого типа данных
При чём здесь вообще константы? В цикле считать факториал и при этом проверять его на переполнение.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
long int mf()
{
 long int r;
 long int t;
 long int i;
 for (i=1, t=1, r=1; ; ++i)
 {
  r*=i;
  if ((r/i)!=t)
  {
   return t;
  }
  t=r;
 }
}
0
ПерС
371 / 287 / 89
Регистрация: 05.11.2013
Сообщений: 820
Записей в блоге: 5
Завершенные тесты: 1
08.11.2013, 14:42 #12
предыдущяя реплика ошибочна, не туда посмотрел

по subj Необязательно всё всегда делать буквально, можно попробовать так
C++
1
2
3
4
5
6
7
 unsigned long int n=0xFFFFFFFF;
 unsigned long int p=1,p1=0; int i=1;
 for (; i<=n; i++) {
  p*=i;
  if (p<p1) break;
  p1=p;
 }
Добавлено через 11 минут
C++
1
 return i;
?
всё равно 13, как и другие варианты кода
0
08.11.2013, 14:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2013, 14:42
Привет! Вот еще темы с ответами:

Задача с факториалами на массив - Delphi
Здравствуйте!пожалуйста, помогите написать программу.у меня ничего не получается:( е^x=1+x/1!+x^2/2!+x^3/3!+x^4/4!+....0&lt;x&lt;1

Пределы с факториалами - Математика
На зачете будут несколько примеров с пределами, в целом тему вроде знаю неплохо, но вот пределы с факториалами решить не могу (важно само...

Программа с факториалами - Visual Basic
Помогите, пожалуйста, написать программу с факториалами ...

Цикл с факториалами - VBA
Вычислить значение у. Подсчет вести до тех пор |уn+1-yn|&lt;e. Значение x, e задавать с клавиатуры. При решении необходимо использовать...


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

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

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