Liczba doskonała jest liczbą naturalną, która jest iloczynem trzech różnych liczb pierwszych. Innymi słowy jest postaci: n = a·b·c, gdzie n to liczba sfeniczna, a, b, c to liczby pierwsze. Liczba takiej postaci będzie miała wtedy dokładnie 8 dzielników: {1, a, b, c, ab, bc, ac, n}.
Pierwsze pięć liczb sfenicznych to: 30, 42, 66, 70, 78, ...
Przykładowo weźmy liczbę 30, 30 = 2·3·5, więc jest liczbą sfeniczną. Innym przykładem jest 66, która rozkłada się następująco 66 = 2·3·11.
Podczas kodowania pomocna będzie funkcja, która powie czy liczba jest pierwsza. Szerzej na temat szukanie liczb pierwszych tutaj.
W założeniu funkcja divideByPrime() ma za zadanie znaleźć liczbę i, która będzie pierwsza i dzieląca podaną liczbę a. Po znalezieniu liczby podzieli liczbę a przez i i zwróci i.
(2.) Rozpoczynamy poszukiwania liczby i w zakresie [from + 1, a]. (3.) Jeśli kolejna liczba i jest pierwsza i dzieli a to (4.) dzielimy a przez znalezioną liczbę oraz zwracamy znalezioną liczbę i. Jeśli jednak nie znajdziemy liczby pierwszej dzielącej a to (8.) zwracamy 0.
Funkcja isSphenic() przyjmuje jeden argument n, który na koniec zwraca wartość logiczną czy liczba n jest sfeniczna.
(2.) Deklarujemy zmienne tymczasowe a, b, c. (3.) Szukamy liczby pierwszej, która dzieli n i buforujemy w zmiennej a. Jeśli zmienna a wyniesie 0 to znaczy, że funkcja divideByPrime() nie znalazła dzielącej liczby pierwszej czyli liczba nie może być sfeniczna, dlatego zwracamy wtedy false. Powtarzamy ten schemat jeszcze dwa razy. Jednak za każdym razem wskazując, aby nowa znaleziona liczba pierwsza była większa od poprzedniej zbuforowanej. Na sam koniec (9.) sprawdzamy czy n wynosi 1. Tylko wtedy n = a•b•c. Jeśli nie to (10.) zwracamy false. W przeciwnym wypadku (11.) true.
Dopiszemy drugą funkcję isSphenicProve(), która nie tylko sprawdzi czy liczba jest sfeniczna, ale również wypisze na ekran rozkład tej liczby. Jest to właściwie funkcja isSphenic() z dodaną linijką przed oryginalną (11.):
Dopiszemy drugą funkcję isSphenicProve(), która nie tylko sprawdzi czy liczba jest sfeniczna, ale również wypisze na ekran rozkład tej liczby. Jest to właściwie funkcja isSphenic() z dodaną linijką przed oryginalną (11.):
(2.) Deklarujemy zmienną i, która będzie nam przechowywać, którą liczbę sprawdzamy pod kątem bycia liczbą sfeniczną. Zaczynamy od 30, ponieważ wiemy, że jest to najmniejsza liczba sfeniczna. (3.) Poszukiwania n liczb sfenicznych będziemy kontynuować aż n osiągnie 0, ponieważ po każdej znalezionej liczbie zmniejszymy n o 1. (4.) Jeśli i-ta liczba jest sfeniczna to (5.) wypisujemy ją na ekran i (6.) zmniejszamy n o 1. Na koniec pętli (8.) zwiększamy i o 1.
Poniższa funkcja main() wczyta od użytkownika liczbę n, a potem wypisze czy liczba jest sfeniczna. Następnie na ekran zostanie wypisane pierwsze pięć liczb sfenicznych.
Napisz funkcję writenSphenicFromTo(), która przyjmie dwa argumenty całkowite from, to, które określą z jakiego zakresu [from, to] liczby sfeniczne mają zostać wypisane.