22.04.2010, 03:43
общий
это ответ
Здравствуйте, Юдин Евгений Сергеевич.
Не знаю что такое "на АВС работала", но нижеприведенный код писался и проверялся в ТР-7.0
Множество в виде массива в приведенном решение ведет себя как и традиционные множества (только места в памяти больше занимает).
Обратите внимание на замечание!
Приложение:
{
Замечание:
Строго говоря множество допустимых рассматриваемых чисел должно начинаться не с 0, а с 1,
так как результат операции деления на 0 не определен.
}
Uses
Crt;
Type
TSet = Set of Byte; {Множество в стиле Паскаля}
TSetAr = Array[1..255] of byte; {Множество в виде массива}
Const
MaxCount = 20; {Число элементов в генерируемом множестве}
Var
i: Integer; {счетчик}
num, min: Byte; {генерируемое число, минимальное значение}
sSrc, sRes: TSet; {исходное и результирующее множество в традиционном представлении}
aSrc, aRes: TSetAr; {исходное и результирующее множество в виде массива}
begin
ClrScr; {Очистка экрана}
Randomize; {Инициализация счетчика псевдослучайных чисел}
{Init sets}
for i:=1 to 255 do begin {заполним множества в виде массива начальными нулями}
aSrc[i] := 0;
aRes[i] := 0;
end;
for i:=1 to MaxCount do begin {генерируем числа последовательности}
num := Random(254) + 1; {запоминаем случайное число из диапазона 1..255}
Include(sSrc, num); {делаем отметку о нем в традиционном множестве}
aSrc[num] := 1; {и поднимаем флажок в массиве}
end;
Writeln('Source set (both set and array):');
for i:=1 to 255 do begin {вывод на экран сгенерированной последовательности}
if (i in sSrc) {(aSrc[i] = 1)} then {если число в составе множества}
Write(i:4); {напишем его на экране}
end;
Writeln;
min := 0; {сперва минимальное значение не определено}
for i:=1 to 255 do begin
if (min = 0) and (i in sSrc) {(aSrc[i] = 1)} then begin
{когда встретится первое число в множестве}
min := i; {запомним его как минимальное}
Break; {и покинем цикл}
end;
end;
Writeln('min = ', min); {напишем минимальное число на экране}
{Solve - нахождение подмножества}
i := min; {установим счетчик равным минимальному значению}
While (i < 255) do begin {пока значение не больше максимально возможного}
if (i in sSrc) then begin {если значение счетчика присутствует в множестве}
Include(sRes, i); {пополним результирующее множество этим значением}
end;
if (aSrc[i] = 1) then begin {если значение счетчика присутствует в множестве}
aRes[i] := 1; {поднимем флажок в результирующем массиве}
end;
inc(i, min); {перейдем к рассмотрению следующего претендента в подмножество}
end;
Writeln('Result set (from set):'); {вывод результирующего множества из традиционного хранилища}
for i:=1 to 255 do begin
if (i in sRes) then
Write(i:4);
end;
Writeln;
Writeln('Result set (from array):'); {вывод результатов множества из массива}
for i:=1 to 255 do begin
if (aRes[i] = 1) then
Write(i:4);
end;
Writeln;
Writeln('Done. Press any key...');
readkey;
end.