Интересная задача

Интересная задача

Разбираем присланную задачу

Добрый день. Вот такую задачку задали. Необходимо заполнить массив из 31 элемента случайными числами так ,чтобы каждый 3-й элемент был суммой предыдущего и последующего. Массив заполняется 1 раз и не изменяется в процессе. Спасибо

Задача обычная, относится к заполнению массива. Единственный момент — это само условие, а именно последняя часть Массив заполняется 1 раз и не изменяется в процессе. Тут можно понять по-разному: либо от нас требуется, чтобы каждый элемент массива был заполнен один раз и его значение больше не меняли, либо сам процесс ввода должен быть реализован только в одном цикле и не более. Уточнив сей момент, я узнал, что тут дело в одном цикле заполнения.

Итак от нас требуют заполнить массив с помощью оператора randoma, но подчеркивают, что каждый третий элемент должен быть суммой двух соседних. Пусть у нас будет массив s, состоящий из 10 элементов, заполненных произвольно.

Как вы видите все значения элементов случайны и естественно пока каждый третий не равен сумме двух соседних. И вот это как раз и подводит нас к главному моменту в задаче: нет смысла заполнять весь массив только случайными числами, потому что мы ничего не добьемся. Я предлагаю способ, которой по-моему в данной ситуации самый простой: сначала заполнить все элементы, кроме третьих (третьего, шестого, девятого), а потом как раз эти третьи элементы получить в результате сложения предыдущего и последующего элементов.

Тогда возникает другая проблема: третий, шестой и девятые элементы будут заполнены отдельно, что подразумевает на первый взгляд использование еще одного цикла. Однако это противоречит условию. Что же делать? Давайте внимательнее разберем процесс заполнения. Как быстро мы сможем заполнить третий элемент? Как только будут известны значения второго и четвертого. А как быстро можно заполнить шестой элемент? Опять-таки как будут известны значения четвертого и пятого. К чему я клоню? Полный ввод всех элементов можно реализовать в одном цикле по такой схеме (все действия в одном цикле):

  1. заполняем первый и второй элемент
  2. на третьем шаге пропускаем заполнения третьего элемента, потому что нам неизвестно значения четвертого
  3. заполняем четвертый элемент и после этого сразу же заполняем третий
  4. повтор первых четырех шагов но уже для оставшихся элементов

Итак схему наметили . А вот как будет выглядеть код самой схемы

p := 3;
for i := 1 to n do
begin
if i mod 3 <> 0 then s[i] := random(-100, 100);
if i — 1 = p then begin
s[p] := s[i — 2] + s[i];
p := p + 3;
end;
end;

Теперь еще один момент. Представим ту же ситуацию, но количество элементов массива 9. Тут возникает загвоздка. Дело в том, что в данном случае по схеме все будет успешно лишь до девятого элемента. То есть будет заполнен восьмой элемент и на этом цикл закончится. А девятый элемент так и останется не заполненным, потому что цикл делает только 9 шагов, а заполнение 9-ого элемента должно происходить на десятом шаге, которого нет. На этот случай сразу после цикла следует добавить условие.

if n mod 3 = 0 then s[n] := s[n — 1];

Теперь весь код программы. Для оператора random в качестве диапазонов заполнения я выбрал от -100 до 100. Внимание! Здесь приведен пример, когда диапазоны заданы для Pascal ABC. Для Turbo Pascal это необходимо сделать по-другому. Прочитать об этом мы можете в статье оператор random

const
n = 31;

var
p, i: integer;
s: array [1..n] of integer;

begin
randomize;
p := 3;
for i := 1 to n do
begin
if i mod 3 <> 0 then s[i] := random(-100, 100);
if i — 1 = p then begin
s[p] := s[i — 2] + s[i];
p := p + 3;
end;
end;
if n mod 3 = 0 then s[n] := s[n — 1];
for i := 1 to n do
write(s[i]:5);
end.

Задача решена. Здесь n — это длина массива (то есть количество элементов в массиве). Если первым узнать о следующей интересной статье на блоге — подпишитесь на обновления сайта и вы всегда будете в курсе всех новостей .

Нет комментариев

Оставить комментарий