Strona główna » Algorytmy » Artykuły » Liczby Podzielne Wspak
 

Liczby Podzielne Wspak

Definicja

Liczby Podzielne Wspak to takie liczby, które są podzielne przez same siebie zapisane wspak. Taka liczba nie może być liczbą palindromiczną po usunięciu z niej zer z prawej strony.

Przykład

Najmniejszą liczbą Podzielną Wspak jest 510, ponieważ 510 / 15 = 34, a ponadto 51 ≠ 15. Kolejna liczba to 540. W tym przypadku 540 / 45 = 12, a nie jest to też palindrom, bo 54 ≠ 45. Liczba 110 nie spełnia warunku palindromu, ponieważ z liczby należy wpierw usunąć zera (110 na 11) i dopiero sprawdzić czy jest palindromiczna.

Ciąg liczb

Liczby Podzielne Wspak można ustawić w nastepujący ciąg: 510, 540, 810, 2100, 4200, 5100, 5200, 5400, 5610, 5700, ..

Implementacja

Funkcje pomocnicze

Wspak

W celu zapisania liczby wspak należy kolejno zdejmować cyfry z końca i przepisywać do nowej zmiennej.

  1. int Wspak(int a) {
  2.   int wynik = 0;
  3.   while (a > 0) {
  4.     wynik = wynik * 10 + a % 10;
  5.     a /= 10;
  6.   }
  7.   return wynik;
  8. }

Usuń zera

Dopóki na końcu jest zero to należy usunąć tę cyfrę. Dodatkowo należy sprawdzić czy liczba nie jest zerem, ponieważ wtedy można wpaść w nieskończoną pętlę.

  1. int UsunZera(int a) {
  2.   while (a > 0 && a % 10 == 0) {
  3.     a /= 10;
  4.   }
  5.   return a;
  6. }

Czy Podzielna Wspak?

Korzystając z funkcji pomocniczych należy zapisać definicję. Prawda powinna zostać zwrócona tylko wtedy, gdy spełniony jest warunek podzielności oraz palindromu.

  1. bool CzyPodzielnaWspak(int a) {
  2.   int awspak = Wspak(a);
  3.   return a % awspak == 0 && UsunZera(a) != awspak;
  4. }

Testowanie funkcji

Poniższy fragment programu wczytuje od użytkownika zakre poszukiwań n, a następnie wypisuje wszystkie liczby Podzielne Wspak z zakresu [1, n].

  1. int main() {
  2.   int n;
  3.   cout << "Podaj zakres\n n = ";
  4.   cin >> n;
  5.   for (int i = 1; i < n; i++) {
  6.     if (CzyPodzielnaWspak(i)) {
  7.       cout << i << " ";
  8.     }
  9.   }
  10.   system("pause");
  11.   return 0;
  12. }