11 / 73
Feb 2016

Ja rozumiem, że ten program jest napisany słabo i można to napisać 1000 razy lepiej. Ale na spoju jestem jakies 2 dni chyba i niewiele więcej programuje (o ile można to tak nazwać).

Założenia podane w zadaniu spełnia mój program i dla każdego 1<=n<=80 pokazuje poprawne dane wyjściowe. Dlatego nie wiem dlaczego mój program nie jest akceptowany... Rozumiem, że byłby komunikat, że przekroczyłem czas kompilacji czy coś. Ale pokazuje mi błąd. A program działa na 100% dla wszystkich n-ów (nie działał dla n=10 ale już działa, wystarczyło edytować pętle "if (n>10)" na "if (n>=10)").

No ok, ja to rozumiem, że dopiero zaczynasz i trudno znaleźć ci błędy, ale nie pisz, że lata jak marzenie wink Dlatego też, pokazałem Ci szablon-szkic, jak to napisać ładniej.

wynik dla n = 11 22 1 poprawny 11 0
wynik dla n = 22 44 1 poprawny 22 0
itd

Narbej, tu mnie masz! smile

Poprawiłem ten fakt i mój kod teraz wygląda tak:

http://ideone.com/4KxfuA375

I po wklejeniu do sprawdzenia moim oczom ukazał sie napis: "zaakceptowano".

Dziękuję wszystkim, którzy udzielali sie w temacie. Za jakiś czas, kiedy moje skillsy w pisaniu się zwiększą usiąde do tego zadania jeszcze raz wink

Pozdrawiam.

W takim razie gratuluję.
Nie powinieneś tutaj jednak umieszczać ani działających [AC] kodów ani linków do nich, nawet gdy są brzydkie jak noc wink, a przecież teraz już nikt nie będzie analizował co tam zmieniłeś i jak - SPOJ zaliczył więc ok. Co innego, gdybyś pytał jak napisać ładniej i co tam poprawić, ale przecież już Ci odpowiedziłem i ja i simbax [i sam tak planujesz] napisz od nowa, a ten link [nieśmiało proponuję] najlepiej usuń.

5 months later

Dzień dobry! To mój pierwszy post tutaj smile Gdyby ktos chciał mi pomóc, byłabym wdzięczna...
Napisałam kod, problem rozwiązuje, w konsoli śmiga.
Niestety sędzia uparcie go nie akceptuje.
Dlaczego?
Domyślam się, że to jakiś problem z wczytywaniem danych?
Pomocy unamused

http://wklej.org/id/1927934/164

w złym miejscu odczytujesz wartości smile Wywal cout'a z maina(), a wstaw go w miejscu funkcji pala palindrom():

pala palindrom(pala adm)
{
    if(reverse(adm.liczba)==adm.liczba)
    {
        cout<< adm.liczba << " " << adm.count<<endl;
        return adm;
    } 
    .
    .
    .

i byłoby na tyle smile

Ps; Jako tytuł na forum podawaj: nr. tytuł_zadania smile Pozdrawiam.

Dla danych przykładowych wypisujesz:
1212
11113
50
zamiast:
121 2
1111 3
5 0
ale możliwe, że oprócz tego jest jeszcze jakiś inny błąd. Sprawdź.

Faktycznie, pomogło, wielkie dzięki! smile
Ale właściwie.. dlaczego tak?
Inne programy przy 'cout' w mainie przechodziły

Poniższy fragment powinien wyglądać trochę inaczej.

else
    {
       ...
       ....
       palindrom(adm);

poniżej poprawnie.

else
    {
       ...
       ....
       return palindrom(adm);
@korrohulko Ale właściwie.. dlaczego tak?

O ile się dobrze orientuję - sam programuję stosunkowo krótko - chodzi o to, że w ten sposób jak przekazujesz argumenty do funkcji, to przekazujesz tylko ich kopie (po powrocie z funkcji oryginał, którego próbujesz odczytać poprzez użycie cout tak naprawdę się nie zmienił, zmieniła się kopia, na której pracowałaś w innej funkcji). Żeby pracować na oryginałach, powinnaś przekazać argumenty przez referencję lub tak jak napisał @narbej korzystać z "returna". Jednak return zmienia tylko jedną wartość, natomiast przez referencję lub wskaźniki można operować jednocześnie na kilku oryginałach.

Ja to tak rozumiem ;p Mam nadzieję, że słusznie.

Faktycznie, masz rację - brakowało przechwycenia wyniku funkcji przy pomocy return.

Dziękuję Wam obu smile

Warto może dodać, że ten błąd - brak drugiego returnu to nie moja zasługa ani spostrzegawczość. Gdy[byś] kompilujesz[owała] swój program z opcją -Wall [warning all - drukuj wszystkie ostrzeżenia], kompilator, dla twojego programu wypisał[by] takie ostrzeżenie:

g++ -Wall twojProgram.cpp
twojProgram.cpp: In function ‘pala palindrom(pala)’:
twojProgram.cpp:41:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^

Trzeba więc czytać, to co wypisuje kompilator i starać się zrozumieć, co "on" chce nam "po[dpo]wiedzieć" wink

3 months later

Witam chciałby podłączyć się do tematu. Stworzyłem taki oto kod ->`

include

include

using namespace std;

int t, n, liczba, liczba2, licznik;
int tab[10];

int doZmiennej(int *tab, int n);
int doTablicy(int *tab, int liczba);

int main()
{
cin>>t;

for(int i=0; i<t; i++)
{
    cin>>liczba;

    n=doTablicy(tab, liczba);

    while(tab[0]!=tab[n])    
    {
        liczba2=doZmiennej(tab,n);
        liczba+=liczba2;
        licznik++;
        n=doTablicy(tab, liczba);
        cout<<liczba<<" "<<licznik<<endl;
    }
    cout<<liczba<<" "<<licznik<<endl;
    licznik=0;
}

}

int doTablicy(int *tab, int liczba)
{

int i=0;

while(liczba)
{
    tab[i]=liczba % 10;
    liczba/=10;
    i++;    
}

return i-1;

}

int doZmiennej(int *tab, int n)
{
int i=n;
int x=1;
int liczba;

while(i>=0)
{
    liczba+=tab[i]*x;
    i--;
    x*=10;                    
}

return liczba;

}

Kompletnie nie mam pojęcia dlaczego to nie działa. Sprawdzając wynik w pętli wszystko się zgadza. Po wyjściu z pętli dla niektórych liczb pokazuje dobrą wartość dla innych jakieś śmieci. Ślęczę już nad tym jakiś czas i nie wiem w czym jest problem. Może ktoś na to rzucić okiem? Pozdrawiam

kod koszmarny, ale prawie działa :), wystarczy dodać 4 znaki, wliczając 2 znaki '/' aby zasłonić niepotrzebne wyprowadzanie pośredniej wartości i jest AC (a nie WA) - jedynie dzięki temu, że zbytnio ograniczono zakres liczb wejściowych

1 month later

Witam napisałem program może niezbyt ładny i pewnie możną to rozwiązać dużo łatwiej, ale dopiero zaczynam, a utknąłem i nie wiem co jest źle. W CodeBlocks działa niby wszystko poprawnie, ale już w Ideone.com zamiast pokazywać właściwe wyniki na wyjściu pokazuje wprowadzoną daną i liczbę obliczeń 0.
http://ideone.com/re0leZ41
Ps. Czy jest gdzieś możliwość, już po zaliczenia zadania zobaczenia prawidłowego, w sensie wzorcowego rozwiązania, aby porównać go ze swoim i na przyszłość nie popełniać tych samych błędów, a nauczyć się stosować prostsze rozwiązania?
Z góry dziękuje za pomoc i pozdrawiam.

17 days later

Witam, program który napisałem przekracza limit czasu. Wyniki które mi się wyświetlają są poprawne. Nie mam zielonego pojęcia co mógłbym jeszcze usprawnić, dlatego wklejam swój kod,z prośbą o pomoc.
kod: http://ideone.com/RTsqbd36

Zgadza się. tez tak miałem na początku, na początku myślałem, że to błąd w kodzie ale po jakimś czasie się samo naprawiło (w międzyczasie robiłem reset pc), Proponuje zmienić kolejność błędny wynik wyskakuje nie dla tej konkretnej wartości, tylko dla kolejnych wyrazów wejścia. Lecz zupełnie nie mogę znaleźć jakiegoś błędu.

Faktycznie zmiana kolejności zmienia wyjście.

Jak myślisz: czy autor zadania wprowadził opcję if(maciarek zrobił zadanie) then (zrób reset pc i zmień kolejność bo błędny wynik wyskakuje nie dla tej konkretnej wartości tylko dla kolejnych wyrazów wejścia i generalnie po jakimś czasie to się samo naprawi)?

Jeżeli Twój kod nie działa dla prawidłowego, czyli zgodnego z treścią zadania wejścia, które co najwyżej jest w "nieprzyjaznej" dla Twojego programu kolejności to po prostu Twój kod nie działa. Sędzia to nie logika modalna i inne cuda tylko AC albo nie. Pisanie na forum w takim przypadku na ogół mija się z celem bo zwykle wygląda to z perspektywy innych osób mniej więcej tak: "Siemka. Widzę to zadanie i pewnie jest nawet jakaś zależność między wejściem a wyjściem. Ba! Sądzę, że da się to zakodować, ale mi się nie chce... moglibyście zrobić to za mnie? Albo ja wam dam coś co w ogóle nie działa nawet dla przykładowych danych a wy weźcie to przeróbcie". A przecież nie na tym to polega, prawda? :wink:

Słowem: masz błąd w kodzie. Program nie działa (nawet) dla przykładowych danych. Z faktu, że nie działa tylko dla pewnych permutacji, mogę wysunąć przypuszczenie, że algorytm jest prawidłowy i wystarczy tylko znaleźć ten błąd i wszystko będzie ok więc nie poddawaj się. Gdy tylko program zacznie działać jak powinien zgłoś go ponownie. Jeżeli będzie AC to gratuluję :slight_smile: Jeżeli nie - wtedy napisz i ja albo ktoś inny pomoże Ci w znalezieniu błędu.