Laboratorium programowania zad 2

Zadanie 2 z laboratorium programowania na Informatyce UW.

Zadanie 2 (termin wysylania rozwiazan: 25 I 2008, godz. 23:59)

(Liczby Fibonacciego)

Ciag liczb Fibonacciego jest okreslony nastepujaco:

* pierwsza liczba Fibonacciego jest 0
* druga liczba Fibonacciego jest 1
* liczba Fibonacciego o numerze N (wiekszym niz 2) jest suma liczb
  Fibonacciego o numerach N-1 i N-2

Oto kilkanascie poczatkowych wyrazow ciagu liczb Fibonacciego:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...

Napisz program, ktory wczyta z wejscia liczbe calkowita N i wypisze
na wyjscie, w kolejnych wierszach, N poczatkowych wyrazow ciagu liczb
Fibonacciego.

Program powinien wypisac liczby w zapisie pozycyjnym o podstawie 26
poslugujac sie malymi literami alfabetu lacinskiego jako cyframi.
Litera 'a' ma wiec reprezentowac cyfre 0, 'z' to 25. Cyfry nalezy
wypisywac w kolejnosci od najbardziej znaczacych.

Program nie moze zakladac, ze wartosc N bedzie na tyle mala, by liczby
Fibonacciego zmiescily sie w zakresie typow integer, longint itp.
Wolno jedynie zalozyc, ze liczby Fibonacciego, ktore program ma obliczyc,
nie beda mialy wiecej, niz 100 cyfr (w zapisie o podstawie 26).

Np. dla danej:

30

program powinien wypisac:

a
b
c
d
f
i
n
v
bi
cd
dl
fo
iz
on
xm
blz
cjl
dvk
gev
kaf
qfa
baff
bqkf
cqpk
egzp
gxoz
leoo
scdn
bdgsb
bvivo

Wskazowka:

W rozwiazaniu liczby nalezy reprezentowac jako ciagi cyfr w ukladzie
o podstawie 26, zapisane w tablicy.

A oto rozwiązanie:

program zad2;
//Program napisany na zajęcia z Laboratorium Języka Pascal i C. Zadania nr 2.
type tablica=array [1..100] of char;
var n,i:integer;
//Tablice z liczbami
a,b,c : tablica;




procedure dodaj;
//Dodaje tablice a i b, w wsyniku dajac c. Operacja w ukladzie 26
var i,tmp_a,tmp_b,wynik,przeniesienie:integer;
begin
	przeniesienie:=0;
	//Liczby przedstawiamy od prawej strony tablicy.
	for i:=100 downto 1 do
	begin
		wynik:=0;
		tmp_a:=ord(a[i])-97;
		tmp_b:=ord(b[i])-97;
		wynik:=przeniesienie+tmp_a+tmp_b;
		c[i]:=char((wynik mod 26)+97);
		przeniesienie:=wynik div 26;
	end;
	
	//tutaj dodawanie powinno sie zakonczyc.
end;

procedure wypisz(t:tablica);
//Wypisuje tablice
var i:integer;
znak:char;
begin
	
	i:=2;
	znak:=t[1];
	//Pomijamy poczatkowe 0 - czyli a.
	
	while (znak='a') AND (i<101) do
	begin
		znak:=t[i];
		i+=1;
	end;
		
	i:=i-1;

	while i0 then
		writeln('a');

	if n>1 then
		writeln('b');
	
	for i:=3 to n do
	begin
		dodaj;
		wypisz(c);
		a:=b;
		b:=c;
	end;

end.

Leave a Reply