Weryfikacja numeru Pesel, cyfra kontrolna

0

Mam taki kod, sprawdza on poprawność numeru pesel wg https://pl.wikipedia.org/wiki[...]zanie_poprawno.C5.9Bci_numeru

Niektóre numery on sprawdza i są okej, z kolei niektóre numery wyświetla że są niepoprawne (chociaż są dobre), myślę, że tutaj chodzi o to
Przykład dla numeru PESEL 44051401358:

14 + 34 + 70 + 95 + 11 + 34 + 70 + 91 + 13 + 35 = 101
Wyznaczamy resztę z dzielenia sumy przez 10:

101:10 = 10 reszta = 1
Jeżeli reszta = 0, to cyfra kontrolna wynosi 0. Jeżeli reszta ≠ 0, to cyfra kontrolna będzie uzupełnieniem reszty do 10, czyli w podanym przykładzie jest to cyfra 9.

10 – 1 = 9
Wynik 9 nie jest równy ostatniej cyfrze numeru PESEL, czyli 8, więc numer jest błędny.

Proszę o rady, dziękuję

import java.util.Scanner;

public class WeryfikacjaPesel {

    public static void main(String args[]) {

        Scanner load = new Scanner(System.in);

        String numberPesel = load.next();

        if (numberPesel.length() == 11) {

            int pierwszaCyfra = Integer.parseInt(numberPesel.substring(0, 1));
            int drugaCyfra = Integer.parseInt(numberPesel.substring(1, 2));
            int trzeciaCyfra = Integer.parseInt(numberPesel.substring(2, 3));
            int czwartaCyfra = Integer.parseInt(numberPesel.substring(3, 4));
            int piataCyfra = Integer.parseInt(numberPesel.substring(4, 5));
            int szostaCyfra = Integer.parseInt(numberPesel.substring(5, 6));
            int siodmaCyfra = Integer.parseInt(numberPesel.substring(6, 7));
            int osmaCyfra = Integer.parseInt(numberPesel.substring(7, 8));
            int dziewiataCyfra = Integer.parseInt(numberPesel.substring(8, 9));
            int dziesiataCyfra = Integer.parseInt(numberPesel.substring(9, 10));
            int jedenastaCyfra = Integer
                    .parseInt(numberPesel.substring(10, 11));

            int check = 1 * pierwszaCyfra + 3 * drugaCyfra + 7 * trzeciaCyfra
                    + 9 * czwartaCyfra + 1 * piataCyfra + 3 * szostaCyfra + 7
                    * siodmaCyfra + 9 * osmaCyfra + 1 * dziewiataCyfra + 3
                    * dziesiataCyfra;
            int lastNumber = check % 10;
            int controlNumber = 10 - lastNumber;

            if (controlNumber == jedenastaCyfra) {
                System.out.println("Ok pesel");
            }

            else {
                System.out.println("Podałeś błędny numer Pesel");

            }
        }
    }
}
1

Podaj taki przykład jak opisałeś, czyli niektóre numery wyświetla że są niepoprawne (chociaż są dobre).

0

Dziękuję bardzo @szweszwe

Sprawa rozwiązana

1

Kolejne numery możesz przechowywać w jakiejś kolekcji. Konkretny znak ze stringa możesz pobrać za pomocą charAt zamiast substring a to co zapisujesz do check mogłaby zwracać jakaś metoda. Poza tym wypadałoby ujednolicić język nazywania zmiennych i klasy - oczywiście na angielski.

2

Jak to dobrze, że PESEL ma tylko 11 znaków, bo już widziałem oczyma wyobraźni

int trzyTysiacePierwszaCyfra = Integer.parseInt(numberPesel.substring(3000, 3001));

.

            int[] digits = new int[11];
            for(int i=0;i<11;i++){
                digits[i] = Integer.parseInt(numberPesel.substring(i, i + 1));
            }
            int[] weights = {1,3,7,9,1,3,7,9,1,3};
            int check = 0;
            for(int i=0;i<10;i++){
                check += weights[i]*digits[i];
            }
            int lastNumber = check % 10;
            int controlNumber = 10 - lastNumber;

            if (controlNumber == digits[10]) {
                System.out.println("Ok pesel");
0

61092211860
93111401080

pesele z zerami na końcu nie chodzą, a powyższe są poprawne

import java.util.Scanner;

public class WeryfikacjaPeselDwa {

    public static void main(String[] args) {

        System.out.println("Podaj swoj nr Pesel: ");

        Scanner load = new Scanner(System.in);
        String numberPesel = load.next();
        int check = 0;
        int[] tablicaPesel = new int[11];
        for (int i = 0; i < 11; i++) {
            tablicaPesel[i] = Integer.parseInt(numberPesel.substring(i, i + 1));
        }

        int weights[] = { 1, 3, 7, 9, 1, 3, 7, 9, 1, 3 };

        for (int i = 0; i < 10; i++) {
            check += weights[i] * tablicaPesel[i];
        }

        int lastNumber = check % 10;
        int controlNumber = 10 - lastNumber;
        if (controlNumber == tablicaPesel[10]) {
            System.out.println("Ok pesel");
        } else {
            System.out.println("Podales bledny pesel");
        }

    }

}

1

https://pl.wikipedia.org/wiki[...]zanie_poprawno.C5.9Bci_numeru
Przeczytaj uważnie akapit Uwaga implementacyjna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0