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

SPOJ Czy umiesz potęgować

Object Storage Arubacloud
0 głosów
314 wizyt
pytanie zadane 3 lipca 2017 w C i C++ przez Michał Biernacki Użytkownik (670 p.)
Witam, podczas tworzenia programu do potęgowania, wystąpił mi takowy błąd: request for member 'substr' in 'potegowanie', which is of non-class type 'long int'.

Szukałem bardzo długo, ale jakoś nie potrafię sam sobie z tym poradzić, dlatego piszę tutaj.

Kod: https://pastebin.com/ErPT5L5C
1
komentarz 3 lipca 2017 przez vector Dyskutant (9,200 p.)
'length' i 'substr' są metodami klasy std::string, a zmienna 'potegowanie' jest typu int. 'int' nie jest nawet klasą, więc skąd zdziwienie, że ten kod produkuje błąd kompilacji ?
komentarz 3 lipca 2017 przez Michał Biernacki Użytkownik (670 p.)
przywrócone 3 lipca 2017 przez Michał Biernacki
Dlatego właśnie chciałem przekonwertować int na string... :/ A co do klas to nawet do nich nie doszedłem, a niejednokrotnie robiłem konwersje. Przynajmniej tak mi się wydaje...
1
komentarz 3 lipca 2017 przez vector Dyskutant (9,200 p.)

Do konwersji między typami liczbowymi a std::string służy funkcja std::to_string dostępna od c++11 możesz sobie na nią rzucić okiem.

//Edit

To nie jest najlepszy pomysł, aby rozwiązywać w ten sposób to zadanie możesz sobie poszukać informacji o szybkim potęgowaniu modularnym w google.

komentarz 3 lipca 2017 przez Michał Biernacki Użytkownik (670 p.)
Kiedy używam to_string, pisze, że nie jest ona zadeklarowana. Mam bibliotekę <string>. Jeśli chodzi o c++11 to zaznaczyłem w Settings>Compiler>>General.
1
komentarz 3 lipca 2017 przez vector Dyskutant (9,200 p.)
To jest znany bug kompilatora MinGW, gdzieś po internecie krążą patche poprawiające ten błąd.
1
komentarz 3 lipca 2017 przez draghan VIP (106,230 p.)

Przecież linijkę wyżej skonwertowałeś inta potegowanie do typu std::string - wynik zapisałeś w zmiennej o identyfikatorze str.

Wystarczy zmienić:

int dlugosc;
dlugosc = str.length();   

 

komentarz 3 lipca 2017 przez Michał Biernacki Użytkownik (670 p.)
Dziękuję vector, draghan :) Draghan teraz już wszystko działa :) Tak to jest jak się przekleja konwersję z internetu.

// EDIT : Tylko teraz znowu przekraczam limit czasu, ale jakoś coś pokombinuję :)
1
komentarz 3 lipca 2017 przez draghan VIP (106,230 p.)
Aczkolwiek polecam załatać sobie MinGW. Bo kuleje tam nie tylko standardowa konwersja do std::string, ale i w drugą stronę. A to dość przydatne rzeczy. Załatać albo zmienić toolchain na MinGW-w64, który ma to załatane już dawno temu.

1 odpowiedź

0 głosów
odpowiedź 3 lipca 2017 przez Michał Biernacki Użytkownik (670 p.)
edycja 3 lipca 2017 przez Michał Biernacki
Witam ponownie, ponieważ program wyświetla mi dziwne wartosci :/

Skróciłem nieco kod i wygląda on teraz tak: https://pastebin.com/mUzjfAbJ

Wpiszcie sobie np. 10(podstawa) 10(wykładnik) oczywiście po wpisaniu liczby testów :) Wyskakuje -2147483648

Kiedy wpiszę 10 2 pojawia się mi 9 (muszę wyświetlić przy liczbach z więcej niż 1 liczbą, tylko cyfrę jedności). Normalny wynik do 10^2 wynosi 99, zamiast jak to jest na prawdę: 100.

Link do zadania: http://pl.spoj.com/problems/PA05_POT/
komentarz 3 lipca 2017 przez vector Dyskutant (9,200 p.)
Nic dziwnego, gdy próbujesz wyliczyć 10^10 dostajesz jakieś dziwne wyniki, ponieważ maksymalna wartość inta to 2^31, a przecież 10^10 > 2^31 czyli robi Ci się przepełnienie zmiennej.

Nie ma sensu liczyć a^b a później brać pierwszą cyfrę, chociażby z powodu, że w wielu przypadkach program da dziwne wyniki spowodowane przepełnieniem zmiennej.

U mnie wejście 1 10 2 produkuje wyjście 100. Nie wiem dlaczego miałoby Ci dawać 99.
komentarz 3 lipca 2017 przez Michał Biernacki Użytkownik (670 p.)
edycja 3 lipca 2017 przez Michał Biernacki

Niestety, daje mi wynik 9 (oczywiście to tylko cyfra jedności bo pełny wynik to 99).

Może to coś z kompilatorem? Sam nie wiem...

EDIT:

Nic dziwnego, gdy próbujesz wyliczyć 10^10 dostajesz jakieś dziwne wyniki, ponieważ maksymalna wartość inta to 2^31, a przecież 10^10 > 2^31 czyli robi Ci się przepełnienie zmiennej.

Nie wiem czy zauważyłeś (jeśli chodzi o to że porównywałem a%10==0), ale edytowałem link do nowego kodu.

EDIT 2: A odnośnie tych wysokich liczb których int nie jest w stanie pomieścić to na zadaniu na SPOJ'u jest napisane 1<=a,b<=1 000 000 000. Trochę tego nie pojmuję :/

1
komentarz 3 lipca 2017 przez John Doe Obywatel (1,720 p.)
W tym przykładzie a oraz b są w tak ogromnym przedziale, abyś mógł się wykazać myśleniem (może też trochę znajomością teorii liczb) - tworząc odpowiedni algorytm - a nie znajomością programowania :)
komentarz 4 lipca 2017 przez Michał Biernacki Użytkownik (670 p.)
Chodzi o o wykonywanie obliczeń tylko na liczbie jedności? O to że ostatnia cyfra pojawia się cyklicznie? :) Sam bym na to nie wpadł, więc chyba zostawie jak na razie to zadanie. Jednak dalej nurtuje mnie dlaczego kiedy robię 10^2 i jeszcze niektóre potęgi o podstawie 10, 100... to wynik jest o 1 mniejszy od prawidłowego. Np. 10^2 wyświetla 99.
1
komentarz 4 lipca 2017 przez John Doe Obywatel (1,720 p.)

Spójrz na definicje pow cppreference. Zauważ, że funkcja ta działa na liczbach zmiennoprzecinkowych. U Ciebie więc wynik tej funkcji konwertowany jest na liczbę całkowitą, stąd możliwe braki precyzji.

Oto co o int potęga = pow(a,b) wypluwa Visual Studio: "warning C4244: 'initializing': conversion from 'double' to 'int', possible loss of data"

Tu masz podobny wątek o Twoim problemie: stackoverflow

 

Podobne pytania

0 głosów
0 odpowiedzi 412 wizyt
pytanie zadane 28 października 2021 w C i C++ przez DrTomas Nowicjusz (140 p.)
0 głosów
5 odpowiedzi 764 wizyt
pytanie zadane 31 stycznia 2021 w C i C++ przez Rainbow99 Początkujący (430 p.)
+1 głos
1 odpowiedź 1,965 wizyt

92,552 zapytań

141,399 odpowiedzi

319,534 komentarzy

61,938 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!

...