Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задача Особи Зета

Автор: BETTI 22.05.2008 19:52

Особи Зета. На планете Зета обнаружены особи, которые размножаются по следующей схеме: каждая особь дважды создает себе подобную особь – одну в течение первой недели и еще одну в течение второй недели.
Требуется сделать прогноз по количеству новых особей на планете через некоторое время.

Формат ввода:
К ─ первоначальное количество особей (1 ≤ К ≤ 9)
М ─ количество недель, через которое нужно сделать прогноз, 1 ≤ М ≤ 1000
Формат вывода:
N ─ количество новых особей через M недель.

Пример:

Код

Ввод                 Вывод
2                6
3


Помогите, пожалуйста, решить!!!!!!!!!!!!!!!!!!!!!!!!!! smile.gif smile.gif smile.gif

Автор: klem4 22.05.2008 21:55

Я чеcтно говоря не уверен, но вроде результаты похожие на правду:

uses crt;
function F(i: integer): integer;
begin
if i < 3 then F := i
else
F := F(i - 1) + F(i - 2);
end;

var
weeks, alive, one_create, total_created, i: integer;

begin
alive := 2;
weeks := 3;

one_create := 0;
for i := 1 to weeks - 1 do
inc(one_create, F(i));

total_created := alive * one_create;

writeln(total_created);
end.


Добавлено: нет, по крайней мере тест с максимальными данными этот код непройдет

Автор: klem4 22.05.2008 22:15

В общем решение есть для небольших чисел, но без длинной арифметики тут не обойтись, потомучто при M = 1000 число - результат получается просто огромным, ну или я что-то напутал ...

Автор: BETTI 22.05.2008 22:47

Можно сделать ограничения, например, не более 100..это не принипиально.

Автор: klem4 23.05.2008 15:15

Вот, потестируй:

function F(n: integer): Extended;
var
a, b, c, i: Extended;
begin
if n < 3 then F := n else begin
a := 2;
b := 3;
i := 3;
while i < n do begin
c := a;
a := b;
b := b + c;
i := i + 1;
end;
F := b;
end;
end;

var
weeks, alive, one_create, total_created, i: integer;

begin
alive := 2; // k
weeks := 3; // m


one_create := 0;
for i := 1 to weeks - 1 do
one_create := one_create + trunc(F(i));

total_created := alive * one_create;

writeln(total_created);
end.