Algorytm Luhna (numer karty)

Zadanie 12 z 12 · rozdział 5Trudność: 2 z 3pętlemodulosuma kontrolna

Treść zadania

Numery kart płatniczych mają ostatnią cyfrę kontrolną, dzięki której łatwo wykryć literówkę. Sprawdza się ją algorytmem Luhna:

  1. Numeruj cyfry od prawej strony, zaczynając od 1 (ostatnia cyfra ma pozycję 1, przedostatnia 2 itd.).
  2. Każdą cyfrę na pozycji parzystej (2, 4, 6, …) pomnóż przez 2. Jeśli wynik jest większy niż 9, odejmij od niego 9.
  3. Zsumuj wszystkie otrzymane wartości: zmienione cyfry z pozycji parzystych i niezmienione cyfry z pozycji nieparzystych.
  4. Numer jest poprawny, jeśli suma jest podzielna przez 10.

Wczytaj numer jako liczbę całkowitą i sprawdź go algorytmem Luhna, wyznaczając cyfry za pomocą % 10 i // 10.

Dane wejściowe

  • 1. linia: n — numer karty, liczba naturalna mająca od 1 do 19 cyfr

Dane wyjściowe

Jedno słowo: Poprawny, jeśli numer przechodzi test Luhna, w przeciwnym razie Niepoprawny.

Uwagi

  • W każdym obrocie pętli weź ostatnią cyfrę (n % 10), a potem usuń ją z liczby (n //= 10). Dodatkowy licznik (albo zmienna przełączana na zmianę) powie Ci, czy bieżąca cyfra stoi na pozycji parzystej.
  • Odjęcie 9 od podwojonej cyfry to to samo, co zsumowanie cyfr wyniku, np. $2 \cdot 8 = 16$, a $16 - 9 = 7 = 1 + 6$.

Przykłady

Wejście
79927398713
Wyjście
Poprawny

Cyfry od prawej: 3 1 7 8 9 3 7 2 9 9 7. Cyfry z pozycji parzystych (1, 8, 3, 2, 9) po podwojeniu i ewentualnym odjęciu 9 dają 2, 7, 6, 4, 9 (suma 28). Pozostałe cyfry (3, 7, 9, 7, 9, 7) sumują się do 42. Razem $28 + 42 = 70$, a 70 dzieli się przez 10.

Wejście
79927398710
Wyjście
Niepoprawny

Potrzebujesz teorii?

Zasady obowiązujące w rozdziale 5

Zadania w tym rozdziale ćwiczą wyznaczanie cyfr liczby w pętli: ostatnią cyfrę liczby n daje n % 10, a dzielenie całkowite n // 10 usuwa ją z liczby.

Konwencje wspólne:

  • Każde zadanie (i każdy podpunkt) to osobny program: czyta standardowe wejście i wypisuje wynik na standardowe wyjście.
  • Program nie wypisuje komunikatów typu „Podaj liczbę:”. Tekst podany w input("…") jest ignorowany przez sprawdzarkę.
  • „Cyfry od końca” oznacza kolejność od cyfry jedności do najwyższej cyfry (tak, jak wyznacza je n % 10 i n // 10).
  • Liczba 0 ma jedną cyfrę: 0.
  • Jeśli zadanie mówi, że w danym przypadku nic nie trzeba wypisywać, program nie wypisuje nic (nawet pustej linii).

Zadanie pochodzi z otwartego zbioru Nauka-Programowania (z rozwiązaniami wzorcowymi). Zgłoś błąd w treści lub testach.

Python uruchomi się w przeglądarce przy pierwszym teście.

Kod zapisuje się automatycznie w tej przeglądarce. Tab wstawia wcięcie; aby opuścić edytor klawiaturą, naciśnij Esc, a potem Tab.

Testy

Program dostaje „Wejście” przez input() i musi wypisać „Oczekiwane wyjście”. Liczby porównywane są z tolerancją 0,01, a tekst podany w input("…") nie jest sprawdzany.

Test 1

Nie uruchomiono
Wejście
59
Oczekiwane wyjście
Poprawny

Test 2

Nie uruchomiono
Wejście
95
Oczekiwane wyjście
Niepoprawny

Test 3

Nie uruchomiono
Wejście
5
Oczekiwane wyjście
Niepoprawny

Test 4

Nie uruchomiono
Wejście
4111111111111111
Oczekiwane wyjście
Poprawny

Test 5

Nie uruchomiono
Wejście
4111111111111112
Oczekiwane wyjście
Niepoprawny

Test 6

Nie uruchomiono
Wejście
1234567812345670
Oczekiwane wyjście
Poprawny

Test 7

Nie uruchomiono
Wejście
1234567890123456785
Oczekiwane wyjście
Poprawny

Test 8

Nie uruchomiono
Wejście
1234567890123456789
Oczekiwane wyjście
Niepoprawny
Uruchom z własnymi danymi