Liczby Carola to takie liczby całkowite, które są postaci an = 4n - 2n + 1 - 1.
Tego typu ciąg można również otrzymać w inny sposób. W celu otrzymania n - tej liczby Carola wystarczy zapisać kolejno n - 2 cyfr jeden, następnie cyfrę 0, a potem n + 1 liczb 1. Następnie tak przygotowaną liczbę można przeliczyć na dowolny system liczbowy.
Liczby Carola tworzą następujący ciąg: -1, 7, 47, 223, 959, 3967, ..
Rozpatrzmy dwa przypadki wyliczania trzeciej liczby Carola 47. Pierwszy z nich polega na skorzystaniu ze wzoru na n-ty wyraz ciągu: a3 = 43 - 23 + 1 - 1 = 64 - 16 - 1 = 47. Ciekawszym jednak sposobem wyznaczenie jest druga metoda. Zapiszmy kolejno 3 - 2 cyfry 1, cyfrę 0 i 3 + 1 cyfr 1. W ten sposób otrzymuje się 1011112 = 4710.
W celu zrozumienia zasady drugiej metody warto się przyjrzeć wzorowi wyjściowemu. Po pierwsze 4n = 22n co w zapisie binarnym daje cyfrę 1 oraz 2n - 1 cyfr 0. Odejmując od tej postaci 1 liczba teraz będzie się składać z 2n - 1 cyfr 1. Ostatni składnik 2n + 1 to w zapisie binarnym cyfra 1 i n cyfr 0. Oznacza to, że usuwa cyfrę 1 na pozycji n + 2 od prawej. Oznacz to, że po lewej stronie pozostaje (2n - 1) - (n + 1) cyfr 1 czyli n - 2. Dokładnie tyle ile zostało podane w przepisie.
Potęgowanie to kosztowna informacja nawet jeśli zastosuje się technikę szybkiego potęgowania. Z tego względu warto je ograniczyć do minimum. Wzór na n-ty wyraz warto zapisać jako an = (22n - 1)2 - 1. Wtedy kod można zapisać jako funkcję nCarol(), która dla podanego n zwróci n-ty wyraz ciągu:
Drugą metodę wyznaczania liczb Carola można osiągnąć korzystając z operacji binarnych. Pomijając pierwszy przypadek -1. Można zapisać funkcję, która utworzy liczbę złożoną z 2n - 1 cyfr 1 pomijając pozycję n + 2 od prawej.
(2. - 3.) Wyszczególnij nieobsługiwany przypadek. (4.) Utwórz nową liczbę o samych cyfrach 0. (5. - 9.) Wykonaj 2n - 1 operacji polegających na przesunięciu obecnej wartości o 1 pozycję w lewo i ustaleniu pozycji najmniej znaczącej (tj. pierwszej cyfry od prawej).
Działanie pętli można prześledzić na podstawie poniższej tabelki. W poniższym rozwiązaniu przyjęto, że n = 4, a typ zmiennej przechowuje 8 bitów (1 bajt). Na szaro wyszczególniono jeszcze nie ustalone bity.
i | a | Operacja |
---|---|---|
0 | 00000000 | przesuń, 0 != 2: dodaj 1 |
1 | 00000001 | przesuń, 1 != 2: dodaj 1 |
2 | 00000011 | przesuń, 2 != 2: pomiń dodawanie |
3 | 00000110 | przesuń, 3 != 2: dodaj 1 |
4 | 00001101 | przesuń, dodaj 1 |
5 | 00011011 | przesuń, dodaj 1 |
6 | 00110111 | przesuń, dodaj 1 |
7 | 01101111 | przesuń, dodaj 1 |
- | 11011111 | /* wynik końowy */ |
Zwróconą wartość przez program jest a = 011011112 = 223.
W celu przetestowania obu implementacji można skorzystać z przedstawionej funkcji main() wypisującj pierwsze dziesięć wyrazów w kolejnych liniach.
Napisz program, który zsumuje kolejne k liczb Carola począwszy od wyrazu m. Przykładowo funkcja sumakwyrazowCarola() dla m = 1, k = 3 powinna zwrócić 276. Postaraj się znaleźć wzór na sumę, aby ograniczyć wykonywane obliczenia.