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

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

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

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

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

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

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

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ZaMaZaN4iK
Мой лучший друг-отладчик!
163 / 163 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
07.11.2013, 19:03     Задача с факториалами #2
всё очень просто : ограничения на типы данных находятся в файле <climits>. Вызываете нужные вам константы и путём несложного цикла находите максимальное значение факториала для каждого типа данных
ПерС
366 / 282 / 84
Регистрация: 05.11.2013
Сообщений: 810
Записей в блоге: 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
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. Так тут речь идёт о длинной арифметике, а это совсем другая песня и далеко не просто.
mat_for_c
131 / 126 / 28
Регистрация: 26.04.2013
Сообщений: 636
Завершенные тесты: 2
07.11.2013, 19:17     Задача с факториалами #5
Цитата Сообщение от ПерС Посмотреть сообщение
Потом аналогично для unsigned long int
только там отрицательных значений нет )))

Добавлено через 2 минуты
Цитата Сообщение от newbie666 Посмотреть сообщение
для просчёта факториала 2147483647
а его и не надо считать. надо найти максимальный факториал, попадающий в область значений типа.
newbie666
Заблокирован
07.11.2013, 19:29     Задача с факториалами #6
Цитата Сообщение от ПерС Посмотреть сообщение
какого размера можно вычислить факториал в типе данных long int и unsigned long int
а ну тогда ответ и на первый вариант и на второй число 12
Байт
Эксперт C
15551 / 9893 / 1487
Регистрация: 24.12.2010
Сообщений: 18,507
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;
salam
157 / 138 / 11
Регистрация: 10.07.2012
Сообщений: 709
07.11.2013, 20:10     Задача с факториалами #8
Цитата Сообщение от newbie666 Посмотреть сообщение
для просчёта факториала 2147483647 стандартный калькулятор виндовс уже не сгодится
вы хотя бы примерно себе представляете, как растет эта функция?
newbie666
Заблокирован
07.11.2013, 20:15     Задача с факториалами #9
Цитата Сообщение от salam Посмотреть сообщение
вы хотя бы примерно себе представляете, как растет эта функция?
этому учат в ещё в школе

Добавлено через 1 минуту
вы хотите предоставить результат n! 2147483647 ? в студию результат ))))))
ПерС
366 / 282 / 84
Регистрация: 05.11.2013
Сообщений: 810
Записей в блоге: 5
Завершенные тесты: 1
08.11.2013, 14:21     Задача с факториалами #10
Цитата Сообщение от mat_for_c Посмотреть сообщение
только там отрицательных значений нет )))
Почитай, что такое переполнение
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;
 }
}
ПерС
366 / 282 / 84
Регистрация: 05.11.2013
Сообщений: 810
Записей в блоге: 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, как и другие варианты кода
Yandex
Объявления
08.11.2013, 14:42     Задача с факториалами
Ответ Создать тему
Опции темы

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