Для решения некоторых задач на одномерные массивы часто бывает необходимо каким-либо образом отметить элементы, удовлетворяющие условию. Для этого резервируют дополнительный массив Flag, элементы которого заполняют единицами, если соответствующие элементы исходного массива удовлетворяет условию.
Если условий несколько, то "флажки" принимают разное значение (например: "1" и "-1" и др.). Рассмотрим данный прием на практике.
Задача 1: Написать программу для поиска всех простых чисел (до числа N).
Дополнительные сведения: Рассмотрим алгоритм поиска простых чисел на диапазоне от 1 до N методом "Решето Эратосфена". Проиллюстрируем этот метод:
В "решете" остались числа, отмеченные серым цветом. Это простые числа.
(рис 6.1) Идея решения:
Заполняем одномерный массив А подряд идущими числами до N (например: N=22) включительно (таблица ниже):
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
Заполняем элементы массива Flag флажками-единицами, если соответствующие элементы массива А кратны "2" (рис. 6.2):
(рис 6.2) Затем заполняем элементы массива Flag флажками-единицами, если соответствующие элементы массива А кратны "3" (рис. 6.3):
(рис 6.3) В "решете" (массиве А) остались числа, отмеченные серым цветом (рис. 6.4):
(рис 6.4) Для сокращения количества шагов достаточно перебирать элементы массива А до половины (т.к. максимальный делитель n - это n/2).
Решение задачи на Бейсике:
input "n="; n
dim a(n), flag(n)
for i=1 to n
a(i)=i
next
for i = 2 to n/2
if flag(i)=0 then
for j=i+1 to n
if a(j) mod a(i)=0 then flag(j)=1
next j
end if
next i
for i=1 to n
if flag(i)=0 then print a(i);
next
Решение задачи на Паскале:
Program pr;
Var a,flag:array [1..100] of integer;
I,j,n:integer;
begin
writeln ('n=');
readln (n);
for i:=1 to n do
a[i]:=i;
for i:=2 to n div 2 do
if flag[i]=0 then
for j:=i+1 to n do
if (a[j] mod a[i]=0) then flag[j]:=1;
for i:=1 to n do
if flag[i]=0 then writeln (a[i]);
end.
Тест:
| Дано: | 100 |
| Результат: | 1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 97 |
Задача 2: В одномерном массиве, заполненном целыми числами подсчитать число различных элементов.
Идея решения: сравнивая очередной элемент массива А с остальными элементами, заполняем единицей соответствующий повторяющемуся элементу элемент массива Flag. Количество нулевых элементов в массиве Flag и будет равно количеству различных элементов массива А.
Решение задачи На Бейсике:
input "количество чисел"; n
dim a(n), flag(n)
for i = 1 to n
input "введите число"; a(i)
next
for i = 1 to n - 1
if flag(i) = 0 then
for j = i + 1 to n
if a(i)=a(j) then flag(j)=1
next
end if
next
for i = 1 to n
if flag(i)=0 then k = k+1
next
print "k="; k
Решение задачи на Паскале:
Program pr;
var a,flag: array [1..100] of integer;
i,j,n,k: integer;
begin
writeln ('количество чисел');
readln (n);
for i:= 1 to n do
begin
writeln ('введите число');
readln (a[i]);
end;
{==========================}
for i:=1 to n-1 do
if flag[i]=0 then
for j:=i+1 to n do
if a[i]=a[j] then flag[j]:=1;
for i:=1 to n do
if flag[i]=0 then k:=k+1;
writeln ('k=', k);
end.
Тест:
| Дано: | n=10 1, 4, 2, 2, 3, 1, 2, 3, 4, 1 |
| Результат: | k=4 |
Задача 3: Вывести элемент, встречающийся в одномерном массиве чаще других.
Идея решения: При сравнении элементов массива А находим повторяющиеся элементы. Массив Flag заполняем количеством повторений элемента массива А. Затем, применив типовой алгоритм ПОИСКА МАКСИМАЛЬНОГО ЭЛЕМЕТА МАССИВА находим позицию элемента массива А, встречающегося чаще других.
Решение задачи на Бейсике:
input "количество чисел";n
dim a(n), flag(n)
for i = 1 to n
input "введите число"; a(i)
next
for i = 1 to n - 1
if flag(i) = 0 then
for j = i + 1 to n
if a(i) = a(j) then k = k + 1: flag(j) = k
next
k = 0
end if
next
for i = 1 to n
if flag(i) > max then max = flag(i): b = i
next
print "чаще встречается "; a(b);
Решение задачи на Паскале:
var a,flag: array [1..100] of integer;
i,j,n,k,max,b: integer;
begin
writeln ('количество чисел');
readln (n);
for i:= 1 to n do
begin
writeln ('введите число');
readln (a[i]);
end;
{===================}
k:=0;
for i:=1 to n-1 do
if flag[i]= 0 then
for j:=i+1 to n do
begin
if a[i]= a[j] then
begin
k:= k+1;
flag[j]:=k;
end;
k:=0;
end;
max:=flag[1];
for i:=1 to n do
if flag[i]>max then
begin
max:=flag[i];
b:=i;
end;
writeln ('чаще встречается ', a[b]);
end.
Тест:
| Дано: | n=10 1, 4, 2, 2, 3, 1, 2, 3, 2, 1 |
| Результат: | Чаще встречается 2 |
N.Для решения некоторых задач на одномерные массивы часто бывает необходимо каким-либо образом отметить элементы, удовлетворяющие условию. Для этого резервируют дополнительный массив флажков, элементы которого заполняют единицами, если соответствующие элементы исходного массива удовлетворяет условию.
В алгоритме "
При необходимости флажки могут принимать не только единичные значения - они могут "указывать" на разнообразные состояния элементов рассматриваемого массива.
Вопросы.
N методом "Упражнения.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.