Zadanie na Spoj, Pesel, niby wszystko dobrze, a nie akceptuje.

0

Robiłem ostatnio zadania na SPOJ i niestety przyszedł taki Pesel i nie chcę go zaakceptować.
Niby dobrze, na ideone działa, a tu nie akceptuje.

#include <iostream>

int main()
{

    int pesel[11];
    std::string ciag;
    int wynik;

    for (int ile = std::cin.get()-48; ile > 0; ile--)
    {

        std::cin >> ciag;
        for (int i = 10; i >= 0; i--)
            pesel[i] = ciag[i] - 48;

        wynik = pesel[0] + pesel[4] + pesel[8] + pesel[10] + 3*(pesel[1] + pesel[5] + pesel[9]) + pesel[2] + 7*(pesel[2]+pesel[6]) + 9*(pesel[3]+pesel[7]);

        if (wynik <= 0 || ciag.length() < 11 || ciag.length() > 11)
            std::cout << "N\n";
        else if ( wynik % 10 == 0)
            std::cout << "D\n";
        else
            std::cout << "N\n";

    }
    return 0;
}
0

Co to za jakieś nawiasy i mnożenia niestworzone?
<warning><font size="3" color="red">legacy</span></warning>

#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    string C;
    int t;
    
    cin >> t;
    while(t--)
    {
        cin >> C;
        if((C[0]*1 + C[1]*3 + C[2]*7 + C[3]*9 + C[4]*1 + C[5]*3 + C[6]*7 + C[7]*9 + C[8]*1 + C[9]*3 + C[10]*1) % 10 == 0)
            cout << "D\n";
        else
            cout << "N\n";
    }
    
    return 0;
}
0

Nie rozumiem tego spoja...
Ten kod przyjął chociaż ma poważny błąd.

Jeśli suma jest większa od zera, wtedy sprawdzamy jej poprawność.

A przy wpisaniu jedenastu 0 wypisuje D.
Przecież mój program działał podobnie, więc w czym był u mnie błąd?

0

tak się tego nie robi!
Nie pakuj wszystkiego do main. czegoś takiego nie da się czytać i łatwo zrobić błąd jak wszystko ma wpływ na wszystko.

Napisz sobie taką funkcję:

bool isValidPesel(const std::string &pesel) {
     ...
}

A main niech wygląda tak:

int main()
{
    int testCount;
    cin >> testCount;
    for (int i=0; i<testCount; ++i)
    {
        string pesel;
        cin >> pesel;
        cout << (isValidPesel(pesel)?"D":"N") << endl;
    }
    return 0;
}

Przy pisaniu isValidPesel nie pisz czegoś takiego: pesel[2], pesel[4] itp. Najlepiej zapamiętaj czynniki mnożenia w jakieś tablicy i zrób to pętlą.

Kiedy to wynik = pesel[0] + pesel[4] + pesel[8] + pesel[10] + 3*(pesel[1] + pesel[5] + pesel[9]) + pesel[2] + 7*(pesel[2]+pesel[6]) + 9*(pesel[3]+pesel[7]); będzie mniejsze lub równe zero?

Jeszcze jedno: jak piszesz o zdaniu SPOJ zawsze dawaj linka do treści, bo domyślanie się na podstawie twojego kodu co to ma robić nie jest proste.

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