Найти все элементы начального отрезка из 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