• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Code::Blocks generuje źle działający program

Object Storage Arubacloud
0 głosów
259 wizyt
pytanie zadane 31 lipca 2019 w C i C++ przez chemikos Nowicjusz (230 p.)

Cześć wszystkim :)

Napotkałem problem w CodeBlocks, którego nie mogę rozwiązać.

"Program" ma sprawdzać czy podana liczba jest palindromem. Wg mnie powinno wszystko działać poprawnie, ale niestety tak nie jest. Przy liczbie np. 77777 program daje rezultat 0 (false), a oczekiwany to 1 (true). 

Co ciekawe, przy kompilacji tego samego kodu na stronie https://onlinegdb.com/Hy_gTWJmS wszystko działa zgodnie z oczekiwaniem.

Przeinstalowałem nawet Code::Blocks, ale to nic nie zmieniło.
W takim razie moje pytanie. W czym tkwi problem?

#include <iostream>
#include <cmath>
#include <climits>

using namespace std;

bool czy_pal(long long n);

int main()
{
    cout<<"long long: "<<sizeof(long long)<<endl;
    cout<<"max long long: "<<LLONG_MAX<<endl;
    long long liczba;
    for (int i=0;i<7;i++)
    {
        cout<<"Podaj liczbe: ";
        cin>>liczba;
        cout<<liczba<<" - "<<czy_pal(liczba)<<endl;
    }
    return 0;
}
bool czy_pal(long long n)
{
    int i=1;
    long long temp=n;
    while (temp/10>0)
    {
        temp=temp/10;
        i++;
    }
    if (i==1)
        return true;
    long long rj, ri;
    rj=n%10;
    ri=n/(long long)pow(10,i-1);
    while (rj==ri)
    {
        n=(n-ri*(long long)pow(10,i-1))/10;
        if (n<10)
            break;
        i=i-2;
        rj=n%10;
        ri=n/(long long)pow(10,i-1);
    }
    if (n<10)
        return true;
    else
        return false;
}

 

Z góry dziękuję za jakąkolwiek pomoc.

pozdrawiam

chemikos

komentarz 31 lipca 2019 przez j23 Mędrzec (194,920 p.)
edycja 31 lipca 2019 przez j23

Pojechałeś z tymi pow. Nie lepiej i prościej wczytać liczbę w formie tekstowej i sprawdzać tak, jakbyś sprawdzał zwykłe wyrazy?

 

--- dodane ---

Bez tekstu, ale na podobnej zasadzie:

bool czy_pal(long long v)
{
    int i = 0, j = 0;
    int tab[std::numeric_limits<long long>::digits10 + 1];
    
    while (v) {
        tab[i++] = v % 10;
        v /= 10;
    }
    
    while (j < i && tab[--i] == tab[j++]) {}
    
    return i > j;
}

 

komentarz 31 lipca 2019 przez chemikos Nowicjusz (230 p.)
Nie wiem czy lepiej czy nie, ale nie chciałem konwertować liczby na tekst. Sądzę, że w ramach nauki można próbować różnych sposobów. :)
komentarz 31 lipca 2019 przez j23 Mędrzec (194,920 p.)

No to podałem przykład bez konwersji na tekst i bez użycia funkcji pow.

1 odpowiedź

0 głosów
odpowiedź 31 lipca 2019 przez Bondrusiek Maniak (61,370 p.)
Witam,

u mnie ten program działa prawidłowo(MinGW 5.3.0 32bit). Tak na pierwszy rzut oka nie pasuje mi ty long long według https://pl.cppreference.com/w/cpp/language/types tenże typ jest wprowadzony od standardu C++11. Spróbuj zmienić ten typ na np. unsigned long int.Może to pomoże.
komentarz 31 lipca 2019 przez chemikos Nowicjusz (230 p.)
edycja 31 lipca 2019 przez chemikos
Niestety zmiana typu nie pomogła.

Zainstalowałem też inny kompilator i dalej to samo.

 

EDIT:

Z nieznanych dla mnie powodów program zaczął działać prawidłowo, chyba wystarczyło z godzinę pogapić się w kod (bez ingerencji)... Działa z typem long long, pod nowym kompilatorem mimo, że na początku tak nie było. Dziwne.

Podobne pytania

0 głosów
3 odpowiedzi 1,215 wizyt
pytanie zadane 13 listopada 2016 w C i C++ przez Paweł Chmura Nowicjusz (160 p.)
–1 głos
4 odpowiedzi 1,020 wizyt
pytanie zadane 27 lutego 2018 w C i C++ przez Szymon hciećwiedzieć Początkujący (330 p.)

92,583 zapytań

141,434 odpowiedzi

319,669 komentarzy

61,966 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...