Robert Wesołowski
Kod programu napisany w języku Pascal przy pomocy kompilatora Free Pascal Compiler w wersji 2.4.4.
program ciagi;
uses crt;
var koniec:boolean;
tablica: array[1..100] of integer;
liczba: integer;
indeks: byte;
licznik: byte;
a: integer;
maks: byte;
plik: text;
maksymalny: integer;
procedure zmien(liczba: integer; var zwr: integer);
var dziel, pierwsza: integer;
begin
dziel:=(liczba div 10) mod 100;
zwr:=dziel;
end;
begin
clrscr;
textcolor(white);
maks:=0;
liczba:=1000;
assign(plik,'wynik.txt');
rewrite(plik);
repeat
koniec:=true;
writeln(plik,'Badana liczba: ',liczba);
writeln('Badana liczba: ',liczba);
indeks:=1;
zmien(liczba,tablica[indeks]);
write(plik,tablica[indeks]);
write(tablica[indeks]);
while koniec do
begin
zmien(tablica[indeks]*tablica[indeks],tablica[indeks+1]);
write(plik,' -> ',tablica[indeks+1]);
write(' -> ',tablica[indeks+1]);
indeks:=indeks+1;
for licznik:=1 to indeks-1 do
begin
if tablica[licznik]=tablica[indeks] then
begin
koniec:=false;
end;
end;
end;
writeln(plik,'.');
writeln('.');
textcolor(lightgreen);
writeln(plik,'Dlugosc ciagu: ',indeks);
writeln('Dlugosc ciagu: ',indeks);
textcolor(white);
writeln(plik,'==========================================');
writeln('==========================================');
if indeks>maks then
begin
maks:=indeks;
maksymalny:=tablica[1];
end;
liczba:=liczba+10;
until liczba>1990;
writeln(plik,'Maksymalna dlugosc ciagu ',maks,' np. dla x',maksymalny,'x, gdzie x to dowolna cyfra');
writeln('Maksymalna dlugosc ciagu ',maks,' np. dla x',maksymalny,'x, gdzie x to dowolna cyfra');
close(plik);
readln;
end.
Działanie programu.
Program ma zadanie wyszukać liczbę czterocyfrową, która utworzy najdłuższy ciąg bez powtórzeń w następujący sposób: bierze dwie środkowe cyfry i tworzy z nich liczbę, którą podnosi do kwadratu. Z tej powstałej czterocyfrowej liczby bierze znów środkowe cyfry i podnosi do kwadratu. Robi to do momentu, aż jakaś liczba dwucyfrowa wystąpi po raz drugi w danym ciągu, wtedy przerywa działanie pętli. Do otrzymywania liczby ze środkowych liczb służy funkcja zmien, która przyjmuje dwa argumenty: liczba - liczba do zamiany oraz zmienną zwr, która służy do zwracania liczby utworzonej z środkowych cyfr. Aby zminimalizować liczbę operacji przedział testowanych liczb jest od 1000 do 1990 z krokiem co 10, gdyż pierwsza i ostatnia cyfra liczby nie wpływa na działanie algorytmu. A więc mamy do przetestowania 100 kombinacji, od 00 do 99, co realizuje nam pętla repeat … until liczba>1990. Wewnątrz tej pętli znajduje się druga, która dla każdej z tych kombinacji wyszukuje i wypisuje ciąg oraz sprawdza jego długość. Na podstawie długości jest znajdowany najdłuższy ciąg oraz kombinacja, która go realizuje. Program wyświetla wyniki działania, które także zapisuje w pliku o nazwie wyniki.txt w katalogu, w którym sam się znajduje.
Wyniki
Jak można wyczytać w pliku wyniki.txt najdłuższymi ciągami są ciągi oparte na liczbach: x42x i x69x, gdzie x - dowolna cyfra. Ich ciągi przedstawiają się następująco:
x42x: 42 -> 76 -> 77 -> 92 -> 46 -> 11 -> 12 -> 14 -> 19 -> 36 -> 29 -> 84 -> 05 -> 02 -> 00 -> 00.
x69x: 69 -> 76 -> 77 -> 92 -> 46 -> 11 -> 12 -> 14 -> 19 -> 36 -> 29 -> 84 -> 05 -> 02 -> 00 -> 00.
Jak widać oba ciągi mają po 16 elementów (licząc z powtórzonymi kombinacjami 00 na końcu, które przerywają dalsze działanie najbardziej wewnętrznej pętli). Co ciekawe można zauważyć że poza pierwszym elementem ciągi te nie różnią się między sobą.