Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 1
Регистрация: 24.10.2013
Сообщений: 9
1

При вычислении факториала больше пяти сот восьми (508), происходит зацикливание

26.10.2013, 13:52. Показов 1229. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уже спрашивал о своей программе в этой теме с просьбой поискать ошибки: Ошибка вычисления факториала происходит только начиная с числа 149
И спасибо TS6492 (жаль, не знаю, как прислать "спасибо"), он мне здорово помог. Я покопался в программе, и нашел множество грубых ошибок. Теперь же ситуация иная. Вычисляется уже факториал 508 (не знаю, правильно ли, не нашел в интернете ответ, но 300 точно правильно.
Но теперь ситуация совершенно другая. Дальше 508 происходит зацикливание. Не знаю почему. Вообще, в паскале разбираюсь не очень. Не знаю всех нюансов. Очень пригодился бы взгляд профессионала.

И еще вопрос. Как включить режим 8087/80287 в коде. Постоянно приходится заходить в настройки и включать вручную, хотя вроде можно с помощью {N+} ... {N-}. Но моя версия или компьютер видит их. будто игнорирует.

Еще беда с uses crt ... clrscr. При их вводе выходит ошибка "Деление на ноль".

Pascal
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
program Factorial;
const max=1000;
var mnimN:array[1..max] of extended;
    N:array[1..max] of shortint;
    F:array[1..max] of extended;
    m, N1:extended;
    k: longint;
    dlinaF, dlinaN, i, j: integer;
begin
 repeat
  begin
 write('Vvedite celoe N ot 1 do 508 vklychitelno: ');
 readln(j)
  end;
 until (j>0) and (j<=508);
 m:=j;
 dlinaN:=1;
 while m>=10 do
  begin
  m:=trunc(m) div 10;
  dlinaN:=dlinaN+1;
  end;
 for i:=1 to max do
  begin
  mnimN[i]:=0;
  N[i]:=0;
  F[i]:=0;
  end;
 F[1]:=1;
 for i:=1 to dlinaN do
  begin
  N[i]:=j mod 10;
  j:=j div 10;
  end;
 while (N[1]<>1) or (dlinaN>1) do
  begin
   k:=max;
   while (k>0) and (F[k]=0) do k:=k-1;
   dlinaF:=k;
   k:=max;
   while (k>0) and (N[k]=0) do k:=k-1;
   dlinaN:=k;
   for i:=1 to max do
    begin
    mnimN[i]:=F[i];
    F[i]:=0;
    end;
   for i:=1 to dlinaF do
    begin
    m:=0;
    for j:=1 to dlinaN do
     begin
     k:=trunc(mnimN[i])*N[j]+trunc(m)+trunc(F[i+j-1]);
     F[i+j-1]:=trunc(k) mod 10;
     m:=trunc(k) div 10;
     end;
     F[i+j]:=m;
    end;
   N[1]:=N[1]-1;
   for i:=1 to dlinaN do
    begin
    if N[i]<0 then
    begin
    N[i]:=N[i]+10;
    N[i+1]:=N[i+1]-1;
    end;
   end;
  end;
  k:=max;
  while (k>0) and (F[k]=0) do k:=k-1;
  dlinaF:=k;
  k:=0;
  writeln;
  writeln('Faktorial ot N raven:');
  for i:=dlinaF downto 1 do write(F[i]:1:0);
  writeln;
  for k:=max downto 1 do
   begin
   for i:=1 to k-1 do
    begin
    if F[i]>F[i+1] then
     begin
     m:=F[i];
     F[i]:=F[i+1];
     F[i+1]:=trunc(m);
     end;
    end;
   end;
  writeln;
  writeln('Otsortirovanniy massiv iz faktoriala:');
  for i:=max-dlinaF+1 to max do write(F[i]:1:0);
  readln;
  end.
Добавлено через 2 минуты
Ах да. Еще компьютер не воспринимает тип int64, будто такого в паскале вообще нет. Но может это вина моего компьютера?

Добавлено через 15 минут
Простите великодушно, но изначальную проблему с зацикливанием решил увеличением константы max. Но насчет остальных проблем с радостью выслушаю предложения. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.10.2013, 13:52
Ответы с готовыми решениями:

Напечатать все цифры, которые перемножаются при вычислении факториала
как напечатать (вывести) все цифры, которые перемножаются при вычислении факториала?

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

Не происходит деление при вычислении выражения
дано выражение: (A^2+D)/(C-B). A=15, B=150h, C=5, D=7. написал вроде код, но не могу понять почему...

Сумма цифр числа, получаемого при вычислении факториала числа 100
n! означает n × (n − 1) × ... × 3 × 2 × 1 Например, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800, ...

11
Почетный модератор
64305 / 47602 / 32742
Регистрация: 18.05.2008
Сообщений: 115,182
26.10.2013, 14:04 2
Цитата Сообщение от Baldy Посмотреть сообщение
Как включить режим 8087/80287 в коде.
В настройках компилятора
Options->Compiler->поставить х в окошечке рядом с 8087/80287
0
0 / 0 / 1
Регистрация: 24.10.2013
Сообщений: 9
26.10.2013, 14:05  [ТС] 3
Но примерно на 1250 выходит ошибка "Ошибочная операция с плавающей запятой". Думаю, это вина оператора trunc. Как вы считаете?
0
Почетный модератор
64305 / 47602 / 32742
Регистрация: 18.05.2008
Сообщений: 115,182
26.10.2013, 14:10 4
Цитата Сообщение от Baldy Посмотреть сообщение
Еще компьютер не воспринимает тип int64, будто такого в паскале вообще нет.
Этот тип есть только во Free Pascal
0
0 / 0 / 1
Регистрация: 24.10.2013
Сообщений: 9
26.10.2013, 14:20  [ТС] 5
Да, так и делаю, но при каждом входе приходится нажимать. Хотя, вроде, этот режим можно включать в коде.

Добавлено через 27 секунд
Хм, спасибо, сейчас скачаю.
0
Почетный модератор
64305 / 47602 / 32742
Регистрация: 18.05.2008
Сообщений: 115,182
26.10.2013, 14:23 6
Цитата Сообщение от Baldy Посмотреть сообщение
Еще беда с uses crt ... clrscr. При их вводе выходит ошибка "Деление на ноль".
Попробуй скачать этот Турбо Паскаль
https://www.cyberforum.ru/atta... 1264398243

Добавлено через 47 секунд
Цитата Сообщение от Baldy Посмотреть сообщение
Хотя, вроде, этот режим можно включать в коде.
Pascal
1
2
programm aaaaa;
{$N+}
1
0 / 0 / 1
Регистрация: 24.10.2013
Сообщений: 9
26.10.2013, 15:26  [ТС] 7
Спасибо, все работает. Оказывается, у меня был Борланд. Но турбо тоже не воспринимает int64.
http://s017.radikal .ru/i424/1310/c9/9c718c680f57.jpg
Извиняюсь, не выходит послать фото иначе.

Добавлено через 31 минуту
Все, достиг максимума приданием типа shortint всем массивам, что дало возможность увеличить константу max до 21000. Вычисляет даже факториал двух миллиардов, по крайней мере процесс идет, это я проверил печатанием в одном месте цикла переменной m. Но конечно же это будет долгий процесс.
0
Почетный модератор
64305 / 47602 / 32742
Регистрация: 18.05.2008
Сообщений: 115,182
26.10.2013, 15:27 8
Цитата Сообщение от Baldy Посмотреть сообщение
Извиняюсь, не выходит послать фото иначе.
Да прикрепи его в тему
https://www.cyberforum.ru/abou... 03521.html
0
0 / 0 / 1
Регистрация: 24.10.2013
Сообщений: 9
26.10.2013, 15:57  [ТС] 9
При вычислении факториала больше пяти сот восьми (508), происходит зацикливание
0
0 / 0 / 1
Регистрация: 24.10.2013
Сообщений: 9
26.10.2013, 15:58  [ТС] 10
Вотъ
0
Почетный модератор
64305 / 47602 / 32742
Регистрация: 18.05.2008
Сообщений: 115,182
26.10.2013, 16:01 11
Цитата Сообщение от Baldy Посмотреть сообщение
Но турбо тоже не воспринимает int64.
Так и нет в нем этого типа, я же писал что только во Фрее Паскаль.
0
0 / 0 / 1
Регистрация: 24.10.2013
Сообщений: 9
26.10.2013, 21:23  [ТС] 12
Ан-нет. Примерно 10000+ уже вычисляет с ошибками...

Добавлено через 29 минут
Для вычисления больших чисел нужно еще увеличить константу max. Нет ли способа это сделать?
0
26.10.2013, 21:23
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.10.2013, 21:23
Помогаю со студенческими работами здесь

Определить, почему во втором варианте программы происходит переполнение при вычислении переменной dist
Добрый вечер. Не могу понять, почему во втором варианте программы происходит переполнение при...

Происходит зацикливание
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;windows.h&gt; #include &lt;list&gt; #include &lt;iterator&gt;...

Происходит зацикливание
Постановка задачи:Номиналы российских рублей могут принимать значения 1, 2, 5, 10, 50, 100, 500,...

Происходит зацикливание!
var k,n:integer; xn,s:longint; begin readln(n); xn:=1; s:=0; k:=1; while k&lt;=n do begin...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
В чем отличие между INNER JOIN и OUTER JOIN
bytestream 22.01.2025
В современных базах данных информация часто распределена между множеством взаимосвязанных таблиц, что делает операции объединения JOIN неотъемлемой частью работы с SQL. Эти операции позволяют. . .
Как сделать первую букву заглавной в JavaScript
bytestream 22.01.2025
JavaScript предоставляет разработчикам множество инструментов для эффективной работы с текстовыми данными. Одной из часто встречающихся задач при обработке строк является преобразование первой буквы. . .
Что такое Big O нотация и алгоритмическая сложность
bytestream 22.01.2025
Введение в алгоритмическую сложность В мире разработки программного обеспечения эффективность алгоритмов играет crucial роль в создании качественных приложений. Алгоритмическая сложность. . .
Как решать конфликты слияния (merge) в Git
bytestream 22.01.2025
Конфликты слияния в системе контроля версий Git возникают в ситуациях, когда две или более ветки разработки содержат несовместимые изменения в одних и тех же участках кода. Эти конфликты представляют. . .
Как использовать регулярные выражения
bytestream 22.01.2025
Регулярные выражения представляют собой мощный инструмент для работы с текстовыми данными, который позволяет осуществлять поиск, проверку и манипуляцию строками на основе определенных шаблонов. Этот. . .
Как выйти из Vim
bytestream 22.01.2025
Vim (Vi IMproved) представляет собой один из самых влиятельных текстовых редакторов в истории компьютерной индустрии, эволюционировавший из своего предшественника Vi, созданного Биллом Джоем в 1976. . .
NoSQL базы данных: что это такое и какие существуют
bytestream 22.01.2025
В современную эпоху цифровой трансформации объемы данных растут экспоненциально, создавая новые вызовы для традиционных систем управления базами данных. NoSQL (Not Only SQL) представляет собой. . .
Обновление исследования от команды MCM (январь 2025 г.)
Programma_Boinc 22.01.2025
Обновление исследования от команды MCM (январь 2025 г. ) Мы продолжаем изучать молекулярные сигнатуры, связанные с раком легких, с текущим фокусом на GCM1, факторе транскрипции, участвующем в. . .
Как работать с Kafka в Go (Golang)
bytestream 22.01.2025
Apache Kafka представляет собой распределенную платформу потоковой передачи данных, которая произвела революцию в области обработки событий и интеграции микросервисов. Эта система, изначально. . .
Как использовать RabbitMQ в Go (Golang)
bytestream 22.01.2025
RabbitMQ представляет собой надежный и широко используемый брокер сообщений, который играет ключевую роль в построении современных распределенных систем и микросервисной архитектуры. В основе работы. . .
Как преобразовать список списков в простой список в Python
bytestream 22.01.2025
При работе с Python разработчики часто сталкиваются с необходимостью обработки сложных структур данных, среди которых особое место занимают вложенные списки. Эти структуры представляют собой списки,. . .
Что такое GUID / UUID и как их создать
bytestream 22.01.2025
В мире разработки программного обеспечения существует постоянная потребность в уникальной идентификации объектов, записей и ресурсов. Эта задача становится особенно актуальной в распределенных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru