Liczby Wyczerpujące w systemie liczbowym o bazie b to taka liczba, która zawiera co najmniej jedną każdą cyfrę w danym systemie liczbowym. Liczba Wyczerpująca nie może mieć na początku cyfr 0. W każdym systemie istnieje takich liczb nieskończenie wiele i zawsze istnieje możliwość wyznaczenia liczby najmniejszej w danym systemie.
Załóżmy, że jesteśmy w systemie binarnym. Wtedy najmniejszą liczbą Wyczerpującą jest 102, ponieważ zawiera wszystkie możliwe cyfry. 112 już nie jest, ponieważ same cyfry 1, ale liczba 1002 już jest. Poniżej została przedstawiona tabelka systemów od binarnego do dziesiętnego z podaną najmniejszą liczbą Wyczerpującą:
System | Najmniejsza liczba wyczerpująca |
---|---|
2 | 10 |
3 | 102 |
4 | 1023 |
5 | 10234 |
6 | 102345 |
7 | 1023456 |
8 | 10234567 |
9 | 102345678 |
10 | 1023456789 |
Pewnie nietrudno zauważyć, że najprostszym sposobem na uzyskanie liczby Wyczerpującej polega na zapisaniu wszystkich cyfr w kolejności rosnącej, a następnie zamianie dwóch najmniej znaczących cyfr: 0 i 1.
W poniższej implementacji zakłada się, że wybranym systemem liczbowym będzie każdy od binarnego do dziesiętnego włącznie. Dla następnych systemów program nie będzie działał prawidłowo.
Na początek napiszmy funkcję najmniejszaWyczerpujaca(), która będzie przyjmowała jeden argument b, który określi w jakim systemie liczbowym ma zostać zwrócona liczba. W celu zwiększenia wartości systemu liczbowego zwracana będzie tablica znaków, a nie typ liczbowy.
(2.) Utwórz listę o b + 1 znakach tj. (na każdą cyfrę systemu b oraz znak końca danych). (3., 4.) Pierwsze dwie cyfry są zawsze znane. (5. - 6.) Dalsze cyfry to kolejne cyfry w danym systemie. (7.) Na koniec należy dodać znak końca danych i (8.) zwrócić tablice reprezentującą liczbę.
Kolejny krok polega teraz na dopisaniu funkcji, która pozwoli uzyskać liczbę większą o 1. Ze względu na fakt, że liczba będzie tablicą znaków to trzeba napisać własną funkcję, która doda do liczby wartość 1. Funkcja przyjmuje dwa argumenty: tablicę znaków l oraz b - system liczbowy w jakim zapisana jest liczba.
(2.) Pobierz długość liczba. (3.) Ustal początkowo, że najmniej znacząca cyfra jest zwiększana o 1. (4. - 8.) Następnie wykonaj dodawanie pisemne. Po tym procesie wartość zmiennej przenies może (9.) nie być równa zero i wtedy należy rozszerzyć tablice.
Rozszerzanie tablicy polega na (10.) zadeklarowaniu nowej tablicy, (11.) dopisania brakującej wartości, (12. - 13.) przepisaniu pozostałych cyfr i (14.) dopisaniu znaku końca danych. Potem bardzo ważne, aby (15.) zdeaalokować poprzednią listę reprezentującą liczbę i (16.) zwrócić nowy wskaźnik na nową "liczbę". (18.) W przypadku, gdy nie ma potrzeby rozszerzania wskaźnik się nie zmienia.
W celu sprawdzenia czy liczba jest wyczerpująca spełniony musi być warunek, że wszystkie cyfry danego systemu liczbowego występują przynajmniej jeden raz. Najprostszym sposobem na implementację jest dodanie funkcji sprawdzCzyWyczerpujaca(), która zadeklaruje pomocniczą tablicę danych typu bool o długości równej ilości cyfr i ustawi wszystkie wartości na fałsz. Następnie program sprawdzi wszystkie cyfry po kolei i jeśli po pętli wszystkie wartości listy są prawdą to znaczy, że podana liczba jest wyczerpująca:
(2.) Zadeklaruj tablicę, gdzie będzie zapisywane czy dany znak występuje. (3. - 4.) Ustal początkowo, że żadna liczba nie występuje. (5.) Dla każdej cyfry w liczba: (6.) ustaw odpowiedni element listy data na prawdę. (7. - 9.) Znajdź koniunkcję występowania wszystkich cyfr. Potem (10.) usuń zadeklarowaną na początku funkcji tablice i (11.) zwróć wynik.
W celu optymalizacji szukania liczb Wyczerpujących za liczbę początkową należy przyjąć najmniejszą liczbę wskazaną przez najmniejszaWyczerpujaca(). Następnie zwiększając wartość o 1 i po kolei sprawdzając czy dana liczba jest wyczerpująca można wypisać n kolejnych liczb ciągu. Funkcja realizująca to zadanie wygląda następująco:
(2.) Pobierz najmniejszą liczbę i (3.) ją wypisz. (4.) Wypisz kolejne n-1 liczb: (6.) zwiększając wartość liczby, aż do (7.) znalezienia kolejnej liczby wyczerpującej. Przed skończeniem iteracji (8.) należy wypisać dane na ekran. (10.) Przed zakończeniem funkcji należy zwolnić pamięć.
Poniższy fragment programu wczytuje od użytkownika dwie liczby: b i n, a następnie wypisuje n pierwszych liczb Wyczerpujących w systemie b.