61 / 73
Nov 2019

Jeśli zmienię kolejność znaków tylko w jednej porównywanej połówce to nie spełnię warunków zadania.

Mając przykładowo liczbę x = 3456 najpierw tworze sobie jej odwrotność czyli 1542. Następnie sumuje dwie wartości i otrzymuje wynik 4998. Teraz sprawdzam czy pierwsze dwie cyfry są równe dwóm ostatnim a ty proponujesz mi odwrócenie kolejności znaków z 49 na 94 i porównanie tego z 98. Nie rozumiem dlaczego ;/

Właśnie o to chodzi. Zadanie polega na sprawdzaniu Czy liczba po zsumowaniu jest palindromem.
121 jest palindromem (treść zadania)
4884 jest palindromem (na marginesie jest to wynik zabawnych dodawań dla 69)
4848 nie jest palindromem

W sumie to nie musisz obracać połówki. Możesz też porównać po kolei znaki pierwszy z ostatnim, drugi z przedostatnim itd jeśli liczba jest dłuższa.

Już rozumiem, zadanie zaliczone.
Dziękuje bardzo za pomoc :slight_smile:

1 year later

Jedyne co widzę to w pętli while(CzyPalindorm(liczba)!= true) zmienna liczba może zyskiwać na długości (wielkości stringa), a liczbaOdwrocona nie (ciągle ma taką samą długość, przez co pewnie wychodzisz poza zakres po kilku iteracjach).

4 months later

Cześć,

jak moi przedmówcy, mam problem z uzyskaniem AC dla tytułowego zadania. Mój kod wygląda tak: https://ideone.com/SRa4c29 i jest napisany w C++.
Już trzeci dzień główkuję nad tym problemem i nie potrafię znaleźć błędu, dlatego proszę o pomoc :slight_smile:.

Dostaje takie same wyniki w moim programie który dostał AC.

EDIT:
w związku z postem @bieniek_k moja analiza jest niepotrzebna i myląca więc skasowałem.

Ja odkryłem że kod kolegi @elefesel nie działa tylko w c++ 4.3.2. W każdej wyższej wersji już dostanie AC, tylko jeszcze nie mogę odkryć skąd się bierze ten błąd
P.S
Po wielu próbach uzyskałem AC na 4.3.2. Zmieniłem tylko jedną rzecz.

ans = palinSum(number, &sumNum);
cout<<ans<<" "<<sumNum<<endl;

A dlaczego nie wiem :smiley: Może ktoś mądrzejszy będzie potrafił to wyjaśnić :smiley:

        cout<<palinSum(number, &sumNum)<<" "<<sumNum<<endl;

Pisząc taką linijkę zakładamy, że cout wykonuje operacje od lewej do prawej. Czyli najpierw wywołana zostanie metoda palinSum, a potem zostanie pobrana wartość z obliczonego już sumNum. A tak być nie musi.

Może się zdarzyć, że najpierw wypiszemy zero, a dopiero potem odpalimy funkcję palinSum.

Poprawka @bieniek_k zadziałała, bo najpierw obliczył wynik, a dopiero potem pobrał wartość.

Dziękuję Wam za pomoc, czasem błędy znajduje się w nieoczekiwanych miejscach. Mnie również zaskoczyło to znalezisko, najwidoczniej muszę przyjrzeć się dokładniej działaniu cout.
Jeszcze raz dziękuję za poświęcony mi czas :slight_smile:

Prawda. Ale morał-wnioski z całej tej dyskusji powinny być dla Ciebie co najmniej taki/takie:
A właściwie sam wyciągnij “je”. Na Ideone użyłeś C++14 (gcc 8.3). Na spoju użyłeś i nadal to robisz - gcc4.3.2, a u “siebie” jeżeli piszesz też na swoim sprzęcie pewnie jeszcze innej wersji kompilatora. Czy to dobrze? Z jednej strony dobrze napisany kod, powinien skompilować się na każdej wersji, czyli super - testujesz przenośność programu, ale jak widać czasami stwarza to problemy - dla tzw “topornie” napisanego kodu, jak powyżej.

A co tam takiego topornego? - a chociażby BEZMYŚLNE użycie zmiennych globalnych - nie żebym miał coś przeciw ich używaniu w malucienkich programikach na spoju, ale chociaż róbmy to z sensem. Inaczej wpadnie to nam w nałóg i będziemy to robić też w dużych, a to już może nie być takie wesołe.