• 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

0 głosów
1,041 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 (57,400 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 (158,960 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 (57,400 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 (57,400 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 (57,400 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 (158,960 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 (158,960 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ź 1,069 wizyt
pytanie zadane 25 lipca 2018 w SPOJ przez Deriquest Użytkownik (550 p.)
0 głosów
0 odpowiedzi 717 wizyt
pytanie zadane 3 października 2019 w SPOJ przez Bartek K. Nowicjusz (230 p.)
0 głosów
1 odpowiedź 767 wizyt
pytanie zadane 29 sierpnia 2018 w SPOJ przez krawiecki Początkujący (490 p.)

93,731 zapytań

142,668 odpowiedzi

323,286 komentarzy

63,290 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...