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:
- Analizar este snippet e verificar se realmente ele faz o que é pedido.
- Se fizer, verificar se o faz correctamente.
- Se não o fizer correctamente, como o corrigir (teoria)
- 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
.