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

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

Разбираем присланную задачу
Добрый день. Вот такую задачку задали. Необходимо заполнить массив из 31 элемента случайными числами так ,чтобы каждый 3-й элемент был суммой предыдущего и последующего. Массив заполняется 1 раз и не изменяется в процессе. Спасибо
Задача обычная , относится к заполнению массива . Единственный момент - это само условие ,а именно последняя часть Массив заполняется 1 раз и не изменяется в процессе . Тут можно понять по-разному : либо от нас требуется ,чтобы каждый элемент массива был заполнен один раз и его значение больше не меняли , либо сам процесс ввода должен быть реализован только в одном цикле и не более. Уточнив сей момент ,я узнал ,что тут дело в одном цикле заполнения.
Итак от нас требуют заполнить массив с помощью оператора randoma,но подчеркивают ,что каждый третий элемент должен быть суммой двух соседних. Пусть у нас будет массив s , состоящий из 10 элементов ,заполненных произвольно.
Интересная задача

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

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

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 - это длина массива ( то есть количество элементов в массиве). Если первым узнать о следующей интересной статье на блоге - подпишитесь на обновления сайта и вы всегда будете в курсе всех новостей .
Понравилась новость? Добавь в закладки!
Хочешь получать свежие новости? Подпишись на обновления с сайта!
Рекомендуем посмотреть:

Добавление комментария

Ваше Имя:
Ваш E-Mail:
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Вставка исходного кода Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера

Введите два слова, показанных на изображении: