Консультация № 61689
07.11.2006, 20:39
0.00 руб.
0 4 4
Здраствуйте Уважаемые эксперты, у меня простой вопрос:
как можно посчитать сколько разных значений есть в массиве т.е. например если a[1]=a, a[2]=b, a[3]=c, a[4]=a то в массиве 3 разные значения: a,b и c. Подскажите как написать алгоритм который считалбы сколько разных значений есть в массиве?
Заранее Спасибо.

Обсуждение

Неизвестный
07.11.2006, 20:50
общий
это ответ
Здравствуйте, Станислав!
Заведите второй массив той же размерности. И перебирая первый массив по элементно проверяйте, есть ли такие элементы в первом массиве, если нет - добавляем новый элемент в массив.
Если заранее известны граници диапазона значений - можно поступить проще. Перебираете Вашь миссив и в элемент mas2[mas1[i]] заносите 1 или увеличиваете на 1, если есть желание узнать сколько каких элементов. Потом перебираете массив 2 и подсчитываете количество не нулевых элементов.
Неизвестный
07.11.2006, 23:06
общий
это ответ
Здравствуйте, Станислав!
Эту задачу я решал и даже решил. Код в приложении.
http://acm.mipt.ru/judge/problems.pl?problem=002
Можете взять этот код за основу, только внимательно посмотрите граничные условия для задачи и сравните их с вашими.

Приложение:
program Project002;{$APPTYPE CONSOLE}var x,y: array[0..31250] of LongWord;// a,b: array[1..1000] of LongInt; z: LongInt; i,j: Integer; Empty: boolean;BEGINfor i := 0 to 31250 do begin x[i] := 0; y[i] := 0; end;Repeat Read(z); if (z > 0) then x[z shr 5] := x[z shr 5] or (1 shl (z and 31));Until (z = -1);Repeat Read(z); if (z > 0) then y[z shr 5] := y[z shr 5] or (1 shl (z and 31));Until (z = -1);Empty := True;for i := 0 to 31250 do begin x[i] := x[i] and y[i]; if (x[i] <> 0) then begin for j := 0 to 31 do if (x[i] and (1 shl j)) <> 0 then begin Write(i shl 5 + j,‘ ‘); Empty := False; end; end; end;if Empty then Write(‘empty‘);END.
Неизвестный
08.11.2006, 04:48
общий
это ответ
Здравствуйте, Станислав!
Посмотрите мой ответ на вопрос №55356 http://rusfaq.ru/info/question/55356
Неизвестный
08.11.2006, 08:28
общий
это ответ
Здравствуйте, Станислав!

Примерно вот так, пример рабочий, проверил !!!
главное не забывать корень квадратный вычислять в конце, для верности подсчета

Приложение:
procedure TForm1.BitBtn1Click(Sender: TObject);var num, i, j, x, Exis:integer; b: array of array of string; s:string;begin num:=0; for i:=1 to length(a) do for j:=length(a) downto 1 do if a[i]=a[j] then begin exis:=-1; for x:=0 to length(b)-1 do if b[x,1]=a[j] then begin exis:=x; break; end; if exis>-1 then b[exis,0]:=inttostr(strtoint(b[exis,0])+1) else begin num:=num+1; setlength(b,num,2); b[num-1,0]:=‘1‘; b[num-1,1]:=a[j]; end; end; s:=‘‘; for i:=0 to length(b)-1 do s:=s+b[i,1]+‘-‘+floattostr(sqrt(strtoint(b[i,0])))+‘ ‘; showmessage(s);
Форма ответа