Дан массив из N чисел найти сумму тех эл-в, номера которых являются числами Фиббоначи.
В первом варианте используем формулу из предыдущей задачи.
program www;
uses
crt;
const
n = 23; //размер массива
function stepen(a:real; k:integer):real; {функция для вычисления числа фиббоначи}
var
i:integer;
res:real;
begin
res:=1;
for i:=1 to k do
res:=res*a;
stepen:=res;
end;
var
mass : array[1..n] of real;
j, b : integer;
a : real; // очередное число фиббоначи
a1, a2 : real;
summ : real; // сумма
begin
randomize;
a1 := (1 + sqrt(5))/2;
a2 := (1 - sqrt(5))/2;
b := 2;
summ := 0; a := 1;
for j := 1 to n do
begin
mass[j] := random(20); // заполняем массив случ. числами от 0 до 20
a := (stepen(a1, b) - stepen(a2, b))/sqrt(5); // получаем очередное число
Фиббоначи
if trunc(a) = j then // если равно тек. номеру эл-та то
begin // значение массива прибавляем к сумме
b := b + 1; // а вывод массива производим другим цветом
summ := summ + mass[trunc(a)];
textcolor(10);
writeln(j, ' ',mass[j]:6:1);
textcolor(7);
end
else
writeln(j, ' ',mass[j]:6:1);
end;
writeln('сумма эл-ов массива = ', summ:6:1);
readln;
end.
Но так как в массиве эл-ты идут по порядку то можно решить и проще.
program Q161852;
uses
CRT;
{ максималный размер массива }
const
MAX_ARR = 50;
var
a, b, c : Integer;
arr: array[1..MAX_ARR] of Real;
summ: Real;
i, n: Byte;
begin
{ вводим N > 0 }
repeat
write('N = '); readln(n);
until ((n > 0) and (n < MAX_ARR));
{ заполняем массив случайными значениями }
Randomize;
a := 1;
b := 1;
{первое число фиббоначи }
c := 1;
{ сумма }
summ:= 0.0;
for i := 1 to n do
begin
arr[i]:= Random(100)/30;
if i = c then
begin
summ:= summ + arr[i];
{ вычисляем следующее число фиббоначи }
c:= a + b;
a:= b;
b:= c;
textcolor(14);
writeln('a[', i, '] = ', arr[i]:2:1);
textcolor(7);
end
else writeln('a[', i, '] = ', arr[i]:2:1);
end;
{ выводим сумму }
writeln('summ = ', summ:3:2);
writeln;
{ ожидаем нажатия любой клавиши }
writeln('Press any key to continue...');
ReadKey;
end.