Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача Особи Зета
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
BETTI
Особи Зета. На планете Зета обнаружены особи, которые размножаются по следующей схеме: каждая особь дважды создает себе подобную особь – одну в течение первой недели и еще одну в течение второй недели.
Требуется сделать прогноз по количеству новых особей на планете через некоторое время.

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

Пример:
Код

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


Помогите, пожалуйста, решить!!!!!!!!!!!!!!!!!!!!!!!!!! smile.gif smile.gif smile.gif
klem4
Я че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
В общем решение есть для небольших чисел, но без длинной арифметики тут не обойтись, потомучто при M = 1000 число - результат получается просто огромным, ну или я что-то напутал ...
BETTI
Можно сделать ограничения, например, не более 100..это не принипиально.
klem4
Вот, потестируй:

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.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.