Задача 18 урок 13.1

Задача 18 урок 13.1

Модифицируйте решение предыдущей задачи, так, чтобы длина возрастающего фрагмента каждый раз увеличивалась на единицу (начиная с двух): ПРИМЕЧАНИЕ: эту задачу можно решить, как вложенными циклами, так и вообще одним циклом (что более изящно), при этом решение одним циклом можно сделать, как используя делимость нацело (для определения момента вывода тройки), так и не используя.
Решите всеми тремя способами.

Способ 1 с вложенным циклом

var N, i, f, m: integer;
begin
  m := 2;   //длина четного блока
  f := 8;   //переменная основного ряда чисел
  writeln('Введите положительное число N');
  readln(N);
  if (N > 0) then
    begin
      while (f < N) do
        begin
          for i := 1 to m do //цикл вывода блока четных
            begin
              if f > N then
                break
              else if (i < m) then //
                begin
                  write(f, ' ');
                  f := f + 2;
                end
              else     //последняя итерация for
                begin
                write(f, ' ');
                write(3, ' ');  //принт '3' и увеличиваем блок чет
                f := f + 2;
                m := m + 1;
                end;
            end;
        end;
    end
   else
     writeln('Ошибка');
   readln();
end.

Одним циклом с mod

var N, i, f, m: integer;     // m - порядковый номер нечет
begin
  m := 1;
  f := 2;                    // перемен адрес '3'
  writeln('Введите положительное число N');
  readln(N);
  if (N > 0) then
    begin
      for i := 8 to N do
        begin
          if (i mod 2 = 0) then   //если чет - принт чет
            write(i, ' ')
          else if (m = f) then
            begin
              write(3, ' ');
              f := f + 1;       //сдвигаем адрес '3'
              m := 1            //обнуляем номер нечет
            end
          else
            m := m + 1;    //считаем нечет
        end;
    end
   else
     writeln('Ошибка');
   readln();
end.

Одним циклом без mod

var N, i, m, t: integer;
begin
  t := 0;  //счетчик количества выводов четного
  m := 2;   //необходимость выводов четного
  i := 8;    // щсновной ряд
  writeln('Введите положительное число N');
  readln(N);
  if (N > 0) then
    begin
      while (i <= N) do
        begin
          write(i, ' ');
          i := i + 2;
          t := t + 1;
          if (t = m) then
            begin
              t := 0;
              m := m + 1;
              write(3, ' ');
            end;
        end;
    end
   else
     writeln('Ошибка');
   readln();
end.