Найти все элементы начального отрезка из n членов последовательности Фибоначчи, являющиеся квадратами - Free Pascal
Формулировка задачи:
Для заданного натурального n(n>=3) найти все элементы начального отрезка из n членов последовательности Фибоначчи, являющиеся квадратами натуральных чисел.
Решение задачи: «Найти все элементы начального отрезка из n членов последовательности Фибоначчи, являющиеся квадратами»
textual
Листинг программы
{$mode objfpc} uses gmp; var sf, sq: mpz_t; // uint64; f: array [0..2] of mpz_t; // uint64; i, n: longint; begin mpz_init_set_si(f[0], 1); mpz_init_set_si(f[1], 1); // f[0] := 1; f[1] := 1; write('n = '); readln(n); for i := 2 to n - 1 do begin mpz_add(f[i mod 3], f[(i - 2) mod 3], f[(i - 1) mod 3]); // f[i mod 3] := f[(i - 2) mod 3] + f[(i - 1) mod 3]; mpz_sqrt(sf, f[i mod 3]); // sf := round(sqrt(f[i mod 3])); mp_printf('F(%d) = %Zd', [i + 1, @f[i mod 3]]); // write('F(', i + 1, ') = ', f[i mod 3]); mpz_mul(sq, sf, sf); if mpz_cmp(sq, f[i mod 3]) = 0 // if sf * sf = f[i mod 3] then mp_printf(' = %Zd^2', [@sf]); // writeln(' = ', sf, '^2') // else writeln end; readln end.
Объяснение кода листинга программы
- Объявлены переменные: — sf, sq: mpz_t; // uint64; — f: array [0..2] of mpz_t; // uint64; — i, n: longint;
- Инициализированы первые два элемента последовательности Фибоначчи: — mpz_init_set_si(f[0], 1); — mpz_init_set_si(f[1], 1);
- Запрошен у пользователя ввод числа n: — write('n = '); readln(n);
- В цикле вычисляются квадраты элементов последовательности Фибоначчи: — for i := 2 to n — 1 do — begin — mpz_add(f[i mod 3], f[(i — 2) mod 3], f[(i — 1) mod 3]); — mpz_sqrt(sf, f[i mod 3]); — mp_printf('F(%d) = %Zd', [i + 1, @f[i mod 3]]); — mpz_mul(sq, sf, sf); — if mpz_cmp(sq, f[i mod 3]) = 0 — then mp_printf(' = %Zd^2', [@sf]); — else mp_printf(' = %Zd^2', [@f[i mod 3]]); — end;
- Программа ожидает ввода данных и выводит результат: — readln
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д