PDA

Просмотр полной версии : pascal : Числа подсчитываются неверно ?


hoty
31.07.2008, 22:23
Это сортировка Методом Хоара :
На входе :
a: массив чисел - integer;
l,r - границы сортируемой части массива (l=1;r=n);
c,m - количество сравнений, пересылок элементов.

procedure sort (var a: array of integer; l,r: integer; var c,m: integer);
var i,j, x,t: integer;
begin

x:=a[L]; {novii element X}
i:=L; j:=R; {prisvaivautsya L,R rabochie chasti massiva }

while i<=j do
begin
while a[i]<x do begin i:=i+1; {C}c:=c+1; end;
while a[j]>x do begin j:=j-1; {C}c:=c+1; end;
{C}c:=c+2;
if i<=j then begin
t:=a[i]; a[i]:=a[j]; a[j]:=t; {M}m:=m+3;
i:=i+1; j:=j-1;
end;
end;

if L<j then sort(a,L,j,c,m); {sortirovka chasti L,J}
if i<R then sort(a,i,R,c,m); {sortirovka chasti i,R}

end;


Вопрос : почему если n (кол-во элементов массива)
< 200 то результат c нормально отображается.
> 200 (300 и более, то при подсчете числа c результат уходит в -, т.е, например, -5123 ?

Как исправить это ? Необходимо, чтобы считалось c правильно при 400 и более.


p.s: аналогичное происходит с возведение x в степень 2 :
если написать x*xто если пишем больше 100 считает в минус.
если же написать так x=exp(2*ln(x)), то считает, практически любые числа правильно.

desTiny
31.07.2008, 23:02
переполнение. смени тип:поставь extended или longint вместо integer. или реализуй собственное прибавление единицы типа длинной арифметики или просто двух longint'ов

hoty
31.07.2008, 23:41
to desTiny :
применял longint, при n>200 c считало неверно.
применил extended работает, при n=400 и более :-)
пасиб :-)