• 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
339 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 (155,460 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 (155,460 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 (155,460 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ź 342 wizyt
pytanie zadane 1 listopada 2019 w C i C++ przez creend Gaduła (4,700 p.)
0 głosów
0 odpowiedzi 393 wizyt
pytanie zadane 3 października 2019 w SPOJ przez Bartek K. Nowicjusz (230 p.)
0 głosów
1 odpowiedź 262 wizyt
pytanie zadane 28 sierpnia 2019 w C i C++ przez Psz3mo Mądrala (5,030 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...