Паскаль. Основы программирования


Задание 2


Составить программу поиска минимума функции, используя "золотое сечение". Для организации цикла используйте условие проверки приближения аргумента с заданной точностью, по аналогии со второй программой. применяющей ряд Фибоначчи.

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

Задание состоит в том, чтобы для произвольного натурального n, найти какие-нибудь два числа a и b, чтобы при таком разрезании прямоугольника a . b получились n

квадратов разных размеров.

Общее решение

Для произвольного натурального числа n можно найти такие числа a и b, чтобы при разрезании получилось ровно n разных размеров квадратов.

В качестве таких чисел можно взять числа f2 и f1 последовательности Фибоначчи.

Если положить a

= f(n + 2) и b = f(n + 1), то каждый раз от прямоугольника

 будет отрезаться только один квадрат со стороной длины f(k - 1) и оставаться прямоугольник
.

Если взять в этой задаче f7 = 13 и f8 = 21; размеры квадратов получатся равными первым шести различным числам Фибоначчи: 1, 2, 3, 5, 8, 13.

Построенный пример прямоугольника a

b имеет наименьшее возможное (при делении на n) размеры; другими словами, если числа a и b не больше f(n + 2), то алгоритм Евклида дает НОД(a, b) не больше, чем за n шагов.

Program

Problem4; { Разрезание прямоугольников на квадраты }

    uses WinCrt;

    var

        a, b, n, i : longint;

{----------------------------------------------------------------------------------------}

    Function fib(n : longint) : longint;

        var

            f, f1, f2, i : longint;

        begin

           f1 := 1; f := 0;

           for i:=1 to n do

              begin

                 f2 := f1; f1 := f;

                 f := f1+f2

              end;

           fib := f

        end;

{---------------------------------------------------------------------------------------}

    begin

       write('Введите натуральное число n '); readln(n);

       a := fib(n + 2); b := fib(n + 1);

       writeln('Прямоугольник, со сторонами ', a, ' и ', b);

      writeln('Можно разделить на ',n,' квадратов со сторонами');

      for i := n+1 downto 2 do

write(fib(i), ' ');

      writeln

    end.




Начало  Назад  Вперед