Форум программистов, компьютерный форум, киберфорум
Наши страницы
Free Pascal
Войти
Регистрация
Восстановить пароль
 
darkden
0 / 0 / 0
Регистрация: 01.05.2013
Сообщений: 3
#1

Исправить ошибку переполнения - Free Pascal

01.05.2013, 15:54. Просмотров 521. Ответов 4
Метки нет (Все метки)

Помогите кто может, кто может помогите.

Использую Free Pascal на Win 7
Имеется программа необходимая для расчёта вероятности событий.

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
program sochets_m;
var
   i, j, n, m, l: integer;
   k1,k2: LongInt;
   a: array[0 .. 100] of integer;
   s, t: string;
   d: set of byte;
 
begin
   write('vvedite N i M: ');
   read(n, m);
   if n<10 then l:=2 else if n<100 then l:=3 else l:=4;
      {form. per. soch.}
   for i:=0 to m do a[i]:=i;
   k1:=0;
   k2:=0;
   repeat
         s:='';
         d:=[];
         for i:=1 to m do begin
            d:=d+[a[i]];
            str(a[i]:l,t);
            s:=s+t
         end;
         if
            (1 in d) and (2 in d) and (3 in d) and (4 in d) or {1}
            (2 in d) and (3 in d) and (4 in d) and (5 in d) or {2}
            (3 in d) and (4 in d) and (5 in d) and (6 in d) or {3}
            (4 in d) and (5 in d) and (6 in d) and (7 in d) or {4}
            (5 in d) and (6 in d) and (7 in d) and (8 in d) or {5}
            (6 in d) and (7 in d) and (8 in d) and (9 in d) or {6}
            (7 in d) and (8 in d) and (9 in d) and (10 in d) or {7}
            (8 in d) and (9 in d) and (10 in d) and (11 in d) or {8}
            (9 in d) and (10 in d) and (11 in d) and (12 in d) or {9}
            (10 in d) and (11 in d) and (12 in d) and (13 in d) or {10}
            (11 in d) and (12 in d) and (13 in d) and (14 in d) or {11}
            (12 in d) and (13 in d) and (14 in d) and (15 in d) or {12}
            (13 in d) and (14 in d) and (15 in d) and (16 in d) or {13}
            (14 in d) and (15 in d) and (16 in d) and (17 in d) or {14}
            (15 in d) and (16 in d) and (17 in d) and (18 in d) or {15}
            (16 in d) and (17 in d) and (18 in d) and (19 in d) or {16}
            (17 in d) and (18 in d) and (19 in d) and (20 in d) or {17}
            (18 in d) and (19 in d) and (20 in d) and (21 in d) or {18}
            (19 in d) and (20 in d) and (21 in d) and (22 in d) or {19}
            (20 in d) and (21 in d) and (22 in d) and (23 in d) or {20}
            (21 in d) and (22 in d) and (23 in d) and (24 in d) or {21}
            (22 in d) and (23 in d) and (24 in d) and (25 in d) or {22}
            (23 in d) and (24 in d) and (25 in d) and (26 in d) or {23}
            (24 in d) and (25 in d) and (26 in d) and (27 in d) or {24}
            (25 in d) and (26 in d) and (27 in d) and (28 in d) or {25}
            (26 in d) and (27 in d) and (28 in d) and (29 in d) or {26}
            (27 in d) and (28 in d) and (29 in d) and (30 in d) or {27}
            (28 in d) and (29 in d) and (30 in d) and (31 in d) or {28}
            (29 in d) and (30 in d) and (31 in d) and (32 in d) or {29}
            (30 in d) and (31 in d) and (32 in d) and (33 in d) or {30}
            (31 in d) and (32 in d) and (33 in d) and (34 in d) or {31}
            (32 in d) and (33 in d) and (34 in d) and (35 in d) or {32}
            (33 in d) and (34 in d) and (35 in d) and (36 in d) or {33}
            (34 in d) and (35 in d) and (36 in d) and (37 in d) or {34}
            (35 in d) and (36 in d) and (37 in d) and (38 in d) or {35}
            (36 in d) and (37 in d) and (38 in d) and (39 in d) or {36}
            (37 in d) and (38 in d) and (39 in d) and (40 in d) or {37}
            (38 in d) and (39 in d) and (40 in d) and (41 in d) or {38}
            (39 in d) and (40 in d) and (41 in d) and (42 in d) or {39}
            (40 in d) and (41 in d) and (42 in d) and (43 in d) or {40}
            (41 in d) and (42 in d) and (43 in d) and (44 in d) or {41}
            (42 in d) and (43 in d) and (44 in d) and (45 in d) or {42}
            (43 in d) and (44 in d) and (45 in d) and (46 in d) or {43}
            (44 in d) and (45 in d) and (46 in d) and (47 in d) or {44}
            (45 in d) and (46 in d) and (47 in d) and (48 in d) or {45}
            (46 in d) and (47 in d) and (48 in d) and (49 in d) or {46}
            (47 in d) and (48 in d) and (49 in d) and (50 in d) or {47}
            (48 in d) and (49 in d) and (50 in d) and (51 in d) or {48}
            (49 in d) and (50 in d) and (51 in d) and (52 in d) or {49}
            (50 in d) and (51 in d) and (52 in d) and (1 in d) or {50}
            (51 in d) and (52 in d) and (1 in d) and (2 in d) or {51}
            (52 in d) and (1 in d) and (2 in d) and (3 in d) {52}
         then begin
            Inc(k2);
            Writeln(k2:10,'     ',s)
         end;
         i:=m;
         while a[i]=n-m+i do dec(i);
         inc(a[i]);
         for j:=i+1 to m do a[j]:=a[j-1]+1;
         Inc(k1);
    until i=0;
    Writeln('Total combinations: ',k1);
    Writeln('X combinations: ',k2);
    end.
Программа останавливается оварийно с ошибкой арифметического переполнения:

C:\fpc\2.6.0\bin\i386-win32\fig41x.exe
Exited with exitcode = 215
Runtime error 215 $ 00402213

Менял integer на byte не помогает.Предлогают использовать ABC, там выдает другую ошибку.
Как исправить ошибку в Free? Огромное спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.05.2013, 15:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Исправить ошибку переполнения (Free Pascal):

Исправить ошибку exitcode 5
program gg; uses crt,Spisok,Dobav_Elem; BEGIN zapoln_spis; add_(n); ...

Исправить ошибку Illegal expression
Что не правильно?

Исправить ошибку при заливке
вот код. в нем ошибка в заливке. помогите довести до ума. спасибо Uses Crt,...

Как исправить ошибку в подсчёте?
Условие задачи:Дана матрица размера M x N и целое число K (1 &lt; K &lt; M). Найти...

Исправить ошибку в программе.Функции
Здравствуйте! Программа должна удалять лишние запятые и восклицательные знаки...

Как исправить ошибку 205?
как исправить ошибку 205?

4
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25613 / 17166 / 6826
Регистрация: 22.10.2011
Сообщений: 30,363
Записей в блоге: 6
01.05.2013, 16:09 #2
Какие ты значения N и M вводишь, при которых ошибка? Проверил на N = 20, M = 10, получил
Total combinations: 184756
X combinations: 84458
И, заодно, в каком режиме компилируется программа? Проверить можно в Options-> Compiler -> Compiler mode. А если еще в Additional Compiler Args там же запишешь -gh, то тебе не только покажет ошибку, но и строку, на которой она возникает.
1
darkden
0 / 0 / 0
Регистрация: 01.05.2013
Сообщений: 3
17.05.2013, 10:38  [ТС] #3
После не одной дароботки код уже выглядит так:

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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
var
  i, n, m, k: integer;
  OurComb, AllComb, tmp: Int64;
  t, s: string;
  fl: boolean;
 
const
  RedOne = '1';
  WhiteOne = '2';
  Empty = '0';
 
function C(n, m: byte): Int64;
var
  i, j: byte;
begin
  result := 1;
  if m <> 0 then
  begin
    j := 2;
    for i := m + 1 to n do
    begin
      result := result * i;
      while (j <= n - m) and (result mod j = 0) do
      begin
        result := result div j;
        inc(j);
      end;
    end;
  end;
end;
 
procedure Permute(p: integer); // использование глобальных переменных для ускорения
var
  i, j: byte;
  ch: char;
begin
  if p = n + 1 then
  begin
    inc(AllComb);
    fl := true;
    j := 0;
    while fl and (j < k) do
    begin
      i := 0;
      while fl and (i < k) do
      begin
        if t[(n - k + j + i) mod n + 1] <> RedOne then
          fl := false;
        inc(i);
      end;
      inc(OurComb, ord(fl));
      fl := not fl;
      inc(j);
    end;
 
    {if AllComb mod 1000000 = 0 then
      writeln(AllComb div 1000000);}
  end
  else
  begin
    fl := false;
    if p - 1 >= k then
    begin
      fl := true;
      i := p - k;
      while fl and (i < p) do
      begin
        if t[i] <> RedOne then
          fl := false;
        inc(i);
      end;
      if fl then
      begin
        j := 0;
        for i := 1 to n do
          inc(j, ord(s[i] = RedOne));
        tmp := C(n - p + 1, j);
        inc(AllComb, tmp);
        inc(OurComb, tmp);
      end;
 
      {if AllComb mod 1000000 = 0 then
        writeln(AllComb div 1000000);}
    end;
    if fl = false then
      for i := 1 to n do
      begin
        if s[i] = Empty then
          continue;
        ch := s[i];
        j := 1;
        while s[j] <> ch do
          inc(j);
        if j = i then
        begin
          t[p] := ch;
          s[i] := Empty;
          Permute(p + 1);
          s[i] := ch;
        end;
      end;
  end;
end;
 
begin
  { cгенерируем S, сначала пойдут красные }
  readln(n, m, k);
  s := '';
  for i := 1 to m do
    s := s + RedOne;
  for i := m + 1 to n do
    s := s + WhiteOne;
  t := s;
  { собственно и сами перестановки }
  OurComb := 0;
  AllComb := 0;
  Permute(1);
  writeln(AllComb, ' ', OurComb);
  readln;
end.
На данный момент мне мужны значения N=52 и M=13
Не подскажите как в паскале включить режим совместимости с делфи?
Спасибо
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25613 / 17166 / 6826
Регистрация: 22.10.2011
Сообщений: 30,363
Записей в блоге: 6
17.05.2013, 10:41 #4
Цитата Сообщение от darkden Посмотреть сообщение
На данный момент мне мужны значения N=52 и M=13
Обязательно надо что-нибудь, но не сказать. У тебя вводятся ТРИ параметра. Два ты сообщил, что вводится в качестве K?
Цитата Сообщение от darkden Посмотреть сообщение
как в паскале включить режим совместимости с делфи?
Pascal
1
{$MODE Delphi}
самой первой строкой программы. Только зачем?
Pascal
1
{$MODE ObjFPC}
работает ничуть не хуже.

А вообще, там у тебя (при таких исходных данных) получаются величины порядка 1021 в результате, какой встроенный целочисленный тип это выдержит? Либо уходить в вещественные числа и давать примерный результат, либо реализовывать задачу при помощи длинной арифметики.
1
darkden
0 / 0 / 0
Регистрация: 01.05.2013
Сообщений: 3
18.05.2013, 09:51  [ТС] #5
Максимальное колличество комбинаций 52!/(13! * 39!) = 635013559600 (влезает только в int64, если рассматривать целые типы)
0
18.05.2013, 09:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2013, 09:51
Привет! Вот еще темы с решениями:

Модуль по двумерным массивам Исправить ошибку
Дан двумерный массив. Найти количество элементов в каждой строке, больших...

Факториал и возведение в степень, исправить ошибку в коде
900! - 200 в степени 100. Мой пример: program kill; var factorial:longint;...

Как исправить ошибку и будет ли она работать правильно?
Нужно, что бы при вводе, например цифры 3, выводило &quot;abc&quot; . Выдаёт ошибку, но...

Не могу исправить ошибку: Can't use read or write on untyped file
Type TTovar = record Nazvan:string; Date:string; Proivod:string; end;...


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

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

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