Ir para o conteúdo

Fibonacci

O desafio

Por: nunopicado.

Este tópico é um quatro em um... Como o champô, mas com mais classe! :-P

Para quem não viu, veja: Touch, com Kiefer Sutherland, na Fox. É uma série interessante, ou pelo menos o primeiro episódio.

A história gira em torno de um miúdo, nascido autista, que tem a capacidade de ver a sequência Fibonacci, números divulgados no ocidente por Leonardo Fibonacci no inicio do séc. XIII (embora não descobertos por ele como o nome parece sugerir), números esses que, consta, estão presentes em toda a natureza, criando padrões que se repetem, ligando todos os elementos ao passado, presente e futuro.

Posto que do nosso três em um já temos as sugestões televisivas e a história, vamos ao n.º 3:

program Project1;

uses
  crt;

var
   f0,f1,tmp: Int64;
   ch:char;

begin
     clrscr;

     f0:=0;
     writeln(f0);
     f1:=1;
     repeat
           writeln(f1);
           tmp:=f0;
           f0:=f1;
           f1:=f1+tmp;

           if wherey=25
              then begin
                        gotoxy(1,wherey+1);
                        write('ESC para terminar, qualquer outra tecla para continuar. . .');
                        ch:=readkey;
                        if ch=#0 then ch:=readkey;
                        clrscr;
                   end;
     until (ch=#27);
end.

O n.º 3 é analizar este código. Este snippet gera a sequência Fibonacci dinâmicamente (ou será que não? LOL) e vai mostrando o resultado no ecrã.

Por fim, o n.º 4: O Desafio

O desafio consiste em:

  1. Analizar este snippet e verificar se realmente ele faz o que é pedido.
  2. Se fizer, verificar se o faz correctamente.
  3. Se não o fizer correctamente, como o corrigir (teoria)
  4. Se não o fizer correctamente, como o corrigir (prática)

E então, alguém quer tentar?

A solução

Por: pedro-kun.

program bigfib;

function sum(a, b: string): string;
var
  i, n, c, t: integer;
begin
  sum := '';
  c := 0;
  n := length(b) - length(a);
  for i := 1 to n do
    a := '0' + a;
  for i := length(b) downto 1 do
  begin
    t := (ord(a[i]) + ord(b[i]) - 2 * ord('0')) + c;
    c := t div 10;
    sum := chr(ord('0') + (t mod 10)) + sum;
  end;
  if c > 0 then
    sum := chr(ord('0') + c) + sum;
end;

var
  i: integer;
  n1, n2, nt: string;
begin
  n1 := '0';
  n2 := '1';
  writeln(sum(n1, n2));
  for i := 2 to 200 do
  begin
    nt := sum(n1, n2);
    n1 := n2;
    n2 := nt;
    writeln(nt);
  end;
end.

A solução era mesmo o uso de strings para conseguir ultrapassar os limites do Int64.