Повторяющиеся элементы
Даны натуральные числа N, A1…, An. Удалить из последовательности A1,…, An повторяющиеся числа. Указать числа, которые имели повторения.
(В ответ на сообщение в форуме. Частично использован код оттуда.)
Некоторые пояснения.
Исходная последовательность заносится в массив А размерностью до максимального NMax, но фактически равна заданному с монитора N.
Массив b - двумерный массив, содержит исключительно повторяющиеся в массиве А элементы и их количество. b[i,1] - повторяющийся элемент, b[i,2]- количество этих элементов в А. Изначально b заполняется нулями. Ясно, что максимальная размерность массива b может достигать половины размерности исходного массива А. Поэтому она описана как 1+NMax div 2. Единица добавлена для случая, когда NMax нечетно, поскольку div возвращает лишь целые числа.
Процедура putInMatch(ind,val:integer) заносит элемент val в массив повторений b. ind - это индекс этого элемента в А (здесь не используется)
Массив unic содержит информацию об уникальности i-того элемента в массиве А. Он нужен, чтобы не искать повторения уже найденных повторов при последующих проходах. В принцие, можно было бы написать простую функцию elementInMatch, но с этим массивом нагляднее, проще и быстрее.
Uses Crt;
Const Nmax=9999;
Type Mas = Array [1..Nmax] of Integer;
ElemUnic = array [1..NMax] of boolean;
Matches = Array [1..1+Nmax div 2,1..2] of Integer;
Var A : Mas; b:Matches; unic : ElemUnic;
i, j, N, nm : Integer;
Flag : Boolean;
Procedure InputOutput;
Begin ClrScr;
Write('N = ');
ReadLn(N);
if N>Nmax then writeln('Oshibka! Vvvedeno slishkom bol~shoe kolichestvo chisel v massive! Vvedite chislo men~she',Nmax,#7);
if N=1 then writeln('v odnom chisle, kak eato ne pechal~no, ne mozhet byt~ povtorjajushchihsja chisel!',#7);
For i := 1 to N do
unic[i]:=true;
For i := 1 to 1+Nmax div 2 do
begin
b[i,1]:=0;b[i,2]:=0;
end;
randomize;
For i := 1 to N do a[i] := random(10);
WriteLn; WriteLn('Massiv A');
For i := 1 to N do Write(A[i],',');
WriteLn; WriteLn
End;
Procedure putInMatch(ind,val:integer);
var inMatch:boolean;
i:integer;
begin
inMatch:=false;
i:=0;
while ((i<nm) and (not inMatch)) do
begin
i:=i+1;
if (b[i,1]=val)
then inMatch := true;
end;
if (inMatch) then
inc(b[i,2])
else
begin
inc(nm);
b[nm,1]:=val;
b[nm,2]:=2;
end;
end;
Procedure Search;
var i:integer;
Begin
for i:=1 to N-1 do
for j:=i+1 to N do
if (unic[j]) then
begin
if (a[i]=a[j]) then
begin
unic[j]:=false;
putInMatch(j,a[j]);
end;
end;
End;
BEGIN
InputOutput;
nm:=0;
Search;
Flag := nm>0;
WriteLn( 'O t v e t : ');
If flag then
begin
WriteLn('Elementy bez povtorov:');
for i:=1 to N do if (unic[i]) then
write(' a[',i,']=',a[i]);
writeln;writeln('Povtoreniya:');
for i:=1 to nm do
writeln(' a[]=',b[i,1],' povtorilsa ',b[i,2],' raz');
end
else WriteLn('Net sovpadajushchih chisel.');
ReadLn
END.
|