Brak akceptacji programu PESEL

0

Rozwiązuję zadania na SPOJU od dłuższego czasu, rozwiązałem ich już przeszło 30, jednak jedno mnie bardzo intryguje. Nie wiadomo dlaczego SPOJ nie akceptuje mi tego programu. Kompilowałem na: MSVC, g++, ideone. Wszędzie działa. Jeśli ktoś znalazł by ten głupi błąd, bądź poinformował o jakiś niuansach sprawdzania kodu tego zadania, to był bym bardzo wdzięczny :)

LINK DO TREŚCI ZADANIA: http://pl.spoj.com/problems/JPESEL/

#include<iostream>

using namespace std;

int main()
{
    char pesel[12];
    int val[11] = {1,3,7,9,1,3,7,9,1,3,1};
    int num=0;
    int sum=0;
    int t=0;

    char result[100];

    cin>>t;

    for (int z= 0; z < t; z++)
    {
        cin>>pesel;

        for (int i = 0; i < 11; i++){
            num = ((int)pesel[i]-48)*val[i];
            sum+=num;
            num=0;
        }
        if(sum%10==0)
            result[z] = 'D';
        else
            result[z] = 'N';
    }
    for (int i = 0; i < t; i++)
    {
        cout<<result[i]<<endl;
    }

    system("pause");
    return 0;
}
0
system("pause");

Usuń to.

EDIT: Nie zerujesz zmiennej sum po każdym obrocie pętli.

0

Nie działa -> SPOJ nie przyjmuje rozwiazania.

Rezultat zawsze -> błędna odpowiedź

0

Nie przeczytałeś dokładnie treści zadania. Na SPOJu, zwłaszcza w prostych zadaniach, zawsze trzeba zwrócić uwagę na szczególne przypadki. Podpowiedź:

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

Przy okazji: nie zapisuj wyników w tablicy - od razu wyrzucaj na wyjście. Druga rzecz, nie używaj strumieni (są za wolne, na SPOJu często Twoje rozwiązania dostaną time limit exceeded nawet przy użyciu dobrego algorytmu, ze względu na zbyt wolne wczytywanie danych).

EDIT: a nie, nawet tego złośliwego przypadku nie ma w testach. Wystarczy wyzerować sumę (jak już poradził @lukasz1235 ) i przechodzi.

1

Ja z innej beczki - o SPOJu wiedziałem od dawna. Ale nigdy jakoś nie chciało się mi zgłaszać tam rozwiązań. Teraz zainteresowany tym tematem zgłośiłem swoje rozwiązanie do tego zadania. Ale jako że cepepe nie zdzierżę to wysłałem w FPC. I oba rozwiązania przyjeło. Tylko ciekawe czy samo zaakceptowanie znaczy, że już jest wszystko ok? Bo nie wertowałem opisów SPOJa.

Tylko ciekawa jedna rzecz. Bo tam przeczą sobie troszkę, widać to choćby na przykładzie właśnie tego zadania JPESEL. Mianowcie przykładowy input i output sugerują, że należy jednak te dane najpierw pobrać, a później wypisac. Także albo robimy to nieoptymalnie na kilka zmiennych. Ale najprościej w większości języków będzie to zrobić stosując tablicę. Skoro mamy najpierw pobrać, a później wypisać. Ale obydwa warianty mi przjęto. Tylko jeżeli ktoś później ma oceniać albo wzrorować się na tych kodach, to na pewno w jakim by języku nie pisać. To za wysoko kodów podanych powyżej ocenić nie można. Chyba większość języków posiada takie elemnty składniowe jak funkcje. Dlatego ja zrobiłem tak jak poniżej dla FPC.

Sam kod tej funkcji do PESELa, żeby nie rzeźbić jej od nowa wziąłem z jakiegoś starego mojego programu w Delphi. Chyba nawet sam algo był gdzieś podany w takiej postaci na Google czy nawet na WIKI. Tylko zangielszczyłem nazewnictwo elementów kodu, bo nie lubię mieszania raz po polsku, a później po innemu. Btw, @madmike'owa marudo Ty moja, pewnie tutaj nie zajrzysz, ale tym razem masz enterów aż nadto. Po samym source wkleje jeszcze kilka żebyś miał na zapaś ;P Anyway, jeśli kiedyś znajdę czas to sobie porozwiązuje. Ale taki SPOJ to chyba lepiej do ćwiczenia nauki jakiegoś języka od podstaw. Pewnie są i trudniejsze zadania, ale klepanie tam tylko po to żeby sprawdzać kod, to imo trochę marnowanie czasu ;)

program pesel;

{$MODE DELPHI}

function StrToInt(const S : string) : integer;
var
  E : integer;
begin
  Val(S, Result, E);
end;

function CheckIsPeselValid(Pesel : string) : boolean;
const
  Mult_Arr : array[1..10] of integer = (1, 3, 7, 9, 1, 3, 7, 9, 1, 3);
var
  I : integer;
  Sum, ControlDigit : integer;
begin
  Result := False;
  if Length(Pesel) = 11 then
  begin
    Sum := 0;
    for I := 1 to Length(Pesel) - 1 do
    begin
      Sum := Sum + (StrToInt(Pesel[I]) * Mult_Arr[I]);
    end;
    Sum := Sum + StrToInt(Pesel[11]);
    ControlDigit := (10 - (Sum mod 10)) mod 10;
    Result := ControlDigit = 0;
  end;
end;

const
  Results_Arr : array[boolean] of Char = ('N', 'D');
var
  S : string;
  I, Code : integer;
  Arr : array of string;
begin
  repeat
    Readln(S);
    Val(S, I, Code);
  until (Code = 0) and (I > 0);
  SetLength(Arr, I);
  for I := Low(Arr) to High(Arr) do
  begin
    Readln(Arr[I]);
  end;
  for I := Low(Arr) to High(Arr) do
  begin
    Writeln(Results_Arr[CheckIsPeselValid(Arr[I])]);
  end;
end.

Powyżej były ENTERy bonusowe dla @madmike, bo ma ich za mało w moich postach ;)

0
olesio napisał(a):

Mianowcie przykładowy input i output sugerują, że należy jednak te dane najpierw pobrać, a później wypisac.
Jeszcze nie widziałem zadania na SPOJu, które by tego wymagało. Input i output są traktowane oddzielnie i nie ważne jest, że w konsoli będą pomieszane.

0

Być może to pomoże, innym analizującym podobny wątek.
Bo ja straciłęm 30 minut z życia bo zapomniałem, przegapiłem o zmianie linii.

..ale

if(sum%10==0)
            result[z] = 'D';
        else
            result[z] = 'N';
    }
    for (int i = 0; i < t; i++)
    {
        cout<<result[i]<<endl;
    }
 
    system("pause"); 

... w wypisywaniu rezultatów brakuje "\n" lub też "endl"
Wypisanie wyniku nie jest konieczne.

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