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

Jpesel spoj, w konsoli działa, ale w spoju nie

VPS Starter Arubacloud
0 głosów
436 wizyt
pytanie zadane 31 maja 2020 w SPOJ przez Dynamic Bywalec (2,910 p.)
zmienione kategorie 31 maja 2020 przez ScriptyChris

Witam mam zadanie ze spoja

https://pl.spoj.com/problems/JPESEL/

mam taki kod

#include <iostream>

using namespace std;
int tablica[11];
int suma=0;
int n=0;
int main()
{
    cin>>n;
    if(n<=100)
    {
        for(int i=1; i<=n; i++)
        {
            for (int j=0; j<11; j++)
            {
                cin >>tablica[j];
            }
            suma=
                tablica[0]+
                tablica[1]*3+
                tablica[2]*7+
                tablica[3]*9+
                tablica[4]+
                tablica[5]*3+
                tablica[6]*7+
                tablica[7]*9+
                tablica[8]+
                tablica[9]*3+
                tablica[10];

            if(suma>0)
            {
                if(suma%10==0)
                {
                    cout<<"D";
                }
                else
                {
                    cout<<"N";
                }
            }
        }
    }
    else
    {
        cin>>n;
    }
    return 0;
}

działa, ale na spoju mam błędną odpowiedź

komentarz 31 maja 2020 przez Whistleroosh Maniak (56,900 p.)
PESEL jest podany jako ciąg 11 cyfr występujących bezpośrednio po sobie, więc jedno wywołanie cin pobierze Ci od razu cały PESEL. Dodatkowo liczba 11-cyfrowa wyjdzie poza zakres zmiennej int, więc albo musisz wczytać wartość do long long albo do stringa.
komentarz 31 maja 2020 przez mokrowski Mędrzec (155,460 p.)

@Dynamic,
zrób z tego funkcję. Miej litość dla czytających i siebie w przyszłości. 4 wcięcia eh...

komentarz 31 maja 2020 przez Dynamic Bywalec (2,910 p.)

@Whistleroosh, a jak mnozyc stringa ? Lub jak dostac sie do pojedynczej liczby w int ?

komentarz 31 maja 2020 przez Whistleroosh Maniak (56,900 p.)
Znaki w stringu trzymasz w ASCII czyli wystarczy, że zapiszesz tak: S[i]-'0' i to da Ci wartość i-tej cyfry. A jeżeli chcesz skorzystać z long long to musisz modulować
komentarz 31 maja 2020 przez Dynamic Bywalec (2,910 p.)
Jak zapisałem tablica[1]-'0'*3 to mam błąd
komentarz 31 maja 2020 przez Whistleroosh Maniak (56,900 p.)
Bardziej tak: (tablica[1]-'0')*3. No i tablica to musi być string
komentarz 1 czerwca 2020 przez Dynamic Bywalec (2,910 p.)

mam aktualnie tak :

#include <iostream>

using namespace std;
string tablica;
int suma=0;
int n=0;
int main()
{
    cin>>n;
    if(n<=100&&n>=1)
    {
        for(int i=1; i<=n; i++)
        {
                cin >>tablica;
            suma=
                (tablica[0]-'0')+
                (tablica[1]-'0')*3+
                (tablica[2]-'0')*7+
                (tablica[3]-'0')*9+
                (tablica[4]-'0')+
                (tablica[5]-'0')*3+
                (tablica[6]-'0')*7+
                (tablica[7]-'0')*9+
                (tablica[8]-'0')+
                (tablica[9]-'0')*3+
                (tablica[10]-'0');
            if(suma>0)
            {
                if(suma%10==0)
                {
                    cout<<"D";
                }
                else
                {
                    cout<<"N";
                }
            }
        }
    }
    return 0;
}

i w spoju nadal nie działa a w konsoli tak

komentarz 1 czerwca 2020 przez Whistleroosh Maniak (56,900 p.)
Odpowiedzi do testów mają być oddzielone znakiem nowej linii

1 odpowiedź

0 głosów
odpowiedź 1 czerwca 2020 przez mokrowski Mędrzec (155,460 p.)

Nie lepiej napisać to czytelniej?

#include <iostream>

bool is_correct_NIP(const std::string& nip_str) {
        unsigned sum{};
        for(const auto& weight: {1, 3, 7, 9, 1, 3, 7, 9, 1, 3, 1}) {
            // To pozostawiam Tobie :)
        }
        return (sum > 0) && (sum % 10 == 0);
}

int main() {
    unsigned short test_counter;
    std::string nip_str;
    std::cin >> test_counter;
    while(test_counter--) {
        std::cin >> nip_str;
        std::cout << (is_correct_NIP(nip_str) ? 'D' : 'N') << '\n';
    }
}

Można to optymalizować, tylko po co? I tak największe obciążenie wprowadzają operacje I/O a nie obliczenia.

komentarz 1 czerwca 2020 przez Dynamic Bywalec (2,910 p.)
Wgl nie znam zapisow tej petli
komentarz 2 czerwca 2020 przez mokrowski Mędrzec (155,460 p.)
No wiesz... to obowiązuje od 2011.... już trochę czasu minęło i myślę że warto się zapoznać :)

Podobne pytania

0 głosów
1 odpowiedź 649 wizyt
pytanie zadane 25 lipca 2018 w SPOJ przez Deriquest Użytkownik (550 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ź 570 wizyt
pytanie zadane 29 sierpnia 2018 w SPOJ przez krawiecki Początkujący (490 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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!

...