Другие языки программирования и технологии

Помогите!!! Надо сделать прогу которая сможет найти 30 первых чисел фибоначчи которые кратны 3!!!

Вот составил прогу которая находит столько чисел фибоначчи сколько я скажу:
var
a,b,c,i,n: integer;
begin
write('n = ');
readln(n);
a := 0;
b := 1;
write(a,' ');
write(b,' ');
for i:=3 to n do begin
write(a+b,' ');
c:= b;
b:= a + b;
a:= c;
end;
readln
end.
var i, n, k: byte; {хватает только на 23 числа, 30 - это перебор}
a: array [1..100] of int64;
begin
write ('введите число n =');
readln (n);
a[1]:=1;
a[2]:=1;
i:=2;
k:=0;
repeat
inc(i);
a[i]:=a[i-2]+a[i-1];
if (a[i] mod 3 = 0) then
begin
writeln (a[i]:25);
inc(k);
end;
until (k >= n);
end.
Сергей Долгов
Сергей Долгов
24 309
Лучший ответ
Не всё так просто, как может показаться. Тридцатое кратное трём число (121-е) равно 5358359254990966640871840 (5,35835925499097 × 10²⁴). Проще говоря представить его целым так запросто не выйдет. Следовательно задачу нужно решать иначе, сначала найти индексы чисел (5, 9, 13, … 113, 117, 121), потом вычислить сами числа по формуле Бине.

function FibNum(f, n: real): real;
begin
// вывод числа Фибоначчи, рассчитанного по формуле Бине:
FibNum:= 1 / Sqrt(5) * (Exp(f * n) - Cos(PI * n) / Exp(f * n));
end;

function FibNumRem(n, m: integer): integer;
var
i, a, b, c: integer;
begin
// поиск остатка от деления n-го числа Фибоначчи на m
a:= 0; b:= 1; Dec(n);
for i:= 1 to n do begin c:= a; a:= b; b:= (c + a) mod m end;
FibNumRem:= b;
end;

var
f: real;
cnt, idx: integer;

begin
// расчет константы формулы Бине:
f:= Ln((1 + Sqrt(5)) / 2);
cnt:= 0; idx:= 1;
repeat
if FibNumRem(idx, 3) = 0 then begin
Inc(cnt);
writeln(cnt:2,' : Fib(', idx + 1, ') = ', FibNum(f, idx))
end;
Inc(idx)
until cnt = 30
end.
Aleksandr Gulyaeff Спасибо, очень помогли! И понятно обьяснили

Похожие вопросы