• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SPOJ - PESEL

VPS Starter Arubacloud
0 głosów
470 wizyt
pytanie zadane 22 lutego 2023 w C i C++ przez alfutek Początkujący (360 p.)

Mam problem ze znalezieniem błędu w zadaniu ze SPOJ -Pesel (link https://pl.spoj.com/problems/JPESEL/ ) w poniższym programie. Niezależnie jaki PESEL wpisze wyrzuca mi N (niepoprawny pesel). co w tym kodzie jest nie tak. 

Jak mam tego błędu poszukać?

Zaczynam dopiero swoją drogę i obecnie uczę się używać kilku zmiennych.

 

Będę wdzięczna za każdą podpowiedź

#include <iostream>
#include <windows.h>

using namespace std;

string sprawdzPesel(string pesel)

{
    long long nrPesel;
    int szyfr[] = {1, 3, 7, 9, 1, 3, 7, 9, 1, 3, 1};
    int suma = 0;
    string wynik;

    for (int i  =0; i < 11; i++)
    {
       suma += (nrPesel % 10 ) * szyfr[i];
       nrPesel /= 10;
    }

    if (suma % 10 == 0)
        wynik = "D";
    else
        wynik = "N";

    return wynik;
}

int main()
{
    int liczbaTestow;
    string pesel;
    cin >> liczbaTestow;

    for (int i = 0; i < liczbaTestow; i++)
    {
        cin >> pesel;
        cout << sprawdzPesel(pesel) << endl;
    }

   return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 22 lutego 2023 przez pasjonat_algorytmiki Pasjonat (19,540 p.)
edycja 22 lutego 2023 przez pasjonat_algorytmiki
Kilka rzeczy:

1 - Unikaj nagłówków w stylu <windows.h>, pisząc coś takiego sam prosisz się o kłopoty, gdy kod jest odpalany na linuxie.

2 - Wszystko jest git, tylko zamiast napisać:

long long nrPesel;

Musisz skonwertować ten pesel(string pesel), to co podajesz w funkcji przekazując do tej zmiennej pisząc:

nrPesel = stoll(pesel);

w ten sposób przekonwertujesz tego stringa co przekazałeś do tej zmiennej nrPesel. stoll oznacza string(S) to(TO) long long(LL), w ten sposób powstaje stoll ;)).

Tak to moim zdaniem kod jest dobry, o ile czegoś nie przeoczyłem.

Edit:

2 błąd jest w linii 16. jest napisane * szyfr[i], a powinno być * szyfr[10-i], albo musisz odwrócić tablicę szyfr.
komentarz 22 lutego 2023 przez pasjonat_algorytmiki Pasjonat (19,540 p.)
a chwila, chwila

2 błąd jest w linii 16.

jest napisane * szyfr[i], a powinno być * szyfr[10-i], albo musisz odwrócić tablicę szyfr.
komentarz 22 lutego 2023 przez mokrowski Mędrzec (156,260 p.)
... może i dobry ale ciężki. Zbędne kopiowania string'a, obsługa przez strumienie, zbędny for w main()...
komentarz 22 lutego 2023 przez pasjonat_algorytmiki Pasjonat (19,540 p.)
edycja 22 lutego 2023 przez pasjonat_algorytmiki

Spokojnie spokojnie, jak na początek nauki, myślę, ze nie chodzi o nauke referencji itp.

A co do obługi przez strumienie, wystarczy, że się napisze w pierwszych 3 linijkach main-a:

ios_base::sync_with_stdio(0);
cout.tie(0);
cin.tie(0);

I z mojego doświadczenia i lekkich testów wrzucania zadań na szkopule, OIJ, OI wynika, że ciny są troszkę szybsze niż scanf-y, a couty tylko delikatnie, ale to naprawdę delikatnie wolniejsze niż printfy, przy założeniu, że zamiast pisać w cout-ach endl, pisze się '\n'.

endl < "\n" < '\n'

Oczywiście to wszystko, przy założeniu, ze doda się te 3 linijki na początku maina, bez tego couty i ciny wychodzą słabo w porównaniu do printf i scanf.

Z printfami i scanfami jest taki problem, w zadaniach konkursowych, że np wczytywałeś int-a, ale zmieniłeś na long long-a, i tych scanf-ow i printf-ow masz dużo i jak np zapomnisz sobie zmienić w jednym miejscu, to dla dużysz liczb wywali ci się program. I Bajtazar da 0 pkt, więc słabo.

komentarz 22 lutego 2023 przez pasjonat_algorytmiki Pasjonat (19,540 p.)

@mokrowski, 

A propo fora, to nie róbmy sobie żartów, że osoba początkująca ma pisać

while(liczbaTestow--)

1
komentarz 22 lutego 2023 przez mokrowski Mędrzec (156,260 p.)
A dlaczego nie? Znam takie które piszą :)
komentarz 22 lutego 2023 przez pasjonat_algorytmiki Pasjonat (19,540 p.)
Ja stosunkowo niedawno poznałem tą składnię, i przynam szczerze, że moje życie niesamowicie się zmieniło, niesamowicie poszerzyło mi to wiedzę, algorytmy teraz same mi wpadają do głowy. Dokładnie moje życie zmieniło się o 360 stopni :)

Chodzi o to, żeby nauczyć się algorytmicznego / programistycznego myślenia, oczywiście implementacja jest ważna, ale czy napiszesz while(z--), czy for (int i = 0; i < z; i++), czy for(int i = 0; i < z; ++i), to nie ma to kompletnie żadnego znaczenia na początek nauki.
komentarz 22 lutego 2023 przez pasjonat_algorytmiki Pasjonat (19,540 p.)
A jeszcze jest z tym pisaniem while(z--), jedno zagrożenie, jakbyś chciał potem skorzystać z tego z. Niepotrzebne robienie sobie problemów na start.
komentarz 22 lutego 2023 przez mokrowski Mędrzec (156,260 p.)
Ojtam ojtam... nie ma co się usztywniać :)

BTW (czarny humor): Ze względu na obecną sytuację polityczną, nie poleca się używania zmiennej 'z'.

Podobne pytania

0 głosów
1 odpowiedź 367 wizyt
pytanie zadane 1 listopada 2019 w C i C++ przez creend Gaduła (4,700 p.)
0 głosów
0 odpowiedzi 433 wizyt
pytanie zadane 3 października 2019 w SPOJ przez Bartek K. Nowicjusz (230 p.)
0 głosów
1 odpowiedź 303 wizyt
pytanie zadane 28 sierpnia 2019 w C i C++ przez Psz3mo Mądrala (5,030 p.)

92,957 zapytań

141,916 odpowiedzi

321,148 komentarzy

62,287 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...