31 / 40
Jul 2019

Po zmianie wyjścia na double program przechodzi powyższy test. Jeśli chodzi o wejście to 2^64-1 powinno się mieścić w zakresie unsigned long long int. Niestety pokazuje WA.

No i się mieści :wink:
Do tego zadania wystarczy w zupełności ten typ, a stosowanie typu zmiennoprzecinkowego [float, double] jest niekonieczne, a nawet jest to błąd. Także string jest tu zupełnie zbędny.

Może przyda Ci się ten link, --> C++ kruczki i sztuczki, sorry, został “nieco” zaśmiecony, więc więcej sztuczek pewnie tam już nie będzie.

To:

if(k1==18446744073709551615) cout << "18446744073709551616" << endl;

oczywiście jest błędne, zobacz na mój wcześniejszy post.

Funkcja pow, jest typu double i działa na takiego typu liczbach, co może powodować i powoduje błędy zaokrągleń - pisałem, że typy zmiennoprzecinkowe nie są tu dobre.

Napisz więc swoją własną funkcję pow2(), typu unsigned long long lub stablicuj wszystkie [tylko 64] wartości potęgi 2
[0] = 1
[1] = 2
[2] = 4

[31] = 214748364

[64] = ? :wink:

1 year later

Mam problem w zadaniu czarodziejskie lusterko z przekroczeniem limitu czasu na SPOJ-u, 1.próbowałem zrobić to zadanie na dwa sposoby przez konwersje z dec na bin, liczbe bin zapisałem do stringa i potem zrobiłem konwersje na dec. 2. wszystkie konwersje zrobilem na liczbach zapisanych w tablicach, czyli liczbe dec skonwertowana na bin zapisałem w tablicy , potem zrobiłem reverse i z tablicy zrobiłem konwersje na dec. Wyniki sie zgadzają ale limit czasu przekroczony :(. Ma ktoś pomysł jak można z tym sie uporać?

Zrobiłem podobnie jak w twoim punkcie 2, patrząc po czasie chyba nie najlepsze rozwiązanie ale nie było TLE.
Spróbuj bez reverse, jak dalej nie pójdzie to można jeszcze coś pokombinować żeby nie liczyć potęg dwójki (tylko trzeba się sporo napisać xD).

1 month later

Popełniłem taki kod:
–>Tutaj był kod <–

Ktoś ma jakiś pomysł dlaczego wywala mi “Przekroczono limit czasu” na ideone pokazuje 0s.

Edit: usunięcie kodu :slight_smile:

1 year later

Cześć,
Podjąłem się zrobienia tego zadania w C#, jednak poległem na optymalizacji kodu, więc postanowiłem spróbować swoich sił z tym zadaniem w C++. Niestety błędna odpowiedź i nie potrafię znaleźć błędu. Problemem była funkcja pow(), jednak ograniczyłem ją do wykonywania potęg max 2^63, gdyż nie potrzeba więcej, przynajmniej tak napisano w poleceniu.
Kod: https://ideone.com/nWsB3k7

Out mamy identyczny.

Hmm… patrząc na kod na szybko nie wiem, co może być przyczyną błędu.

Może użycie funkcji pow, która zwraca double i w związku z tym może być kłopotliwa?

Nie wiem czy błąd leżał w tym co napisałeś, ale przerobiłem kod w ten sposób, że dałem wszystkie potęgi 2 w tablice i AC.

Twoja odpowiedź sugeruje, że dokładnie w rachunku epsilonów leżał błąd. Więc sprawdziłem zastępując funkcją ull pow(ull, ull) skopiowaną z neta.

AC w 0.5 sekundy.

Nie wiem, jak stoisz z doświadczeniem, ale na przyszłość: sprawdzaj deklaracje funkcji, których używasz, a zwłaszcza funkcji matematycznych w cmath. One nie są bezpieczne numerycznie bo nigdy nie miały być. Poza tym, o ile to tylko możliwe, nigdy nie używaj liczb zmiennoprzecinkowych.

Poniżej to, co wysyłam w każdym przypadku, gdy błąd jest związany z infinitezymalnymi:

  1. https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html6
  2. https://onlinejudge.org/external/float-in-competition.pdf2

A w Twoim przpadku: https://en.cppreference.com/w/cpp/numeric/math/pow3 lub http://www.cplusplus.com/reference/cmath/pow/2 (w tym temacie obojętnie które)

Ogólnie jestem samoukiem, kiedyś miałem w szkole podstawy C++, ale to tyle co nic. Coś tam wiem, ale jestem trochę oporny w czytaniu o języku i to jest chyba mój największy problem :sweat_smile: . Dziękuję za to, że poświęciłeś swój czas i mi to przedstawiłeś :wink:

8 months later

Cześć,

Próbowałem już długi czas szukać błędu w moim programie, ale już się poddaję.

  • był tu kiedyś link do programu -
    Moglibyście go sprawdzić i powiedzieć mi co jest z nim nie tak?

a konkretniej w czym problem?
Kod AC po usunięciu jednej linijki i poprawie drugiej… Wskazówka - przy deklaracji tablicy wypadało by znać jej rozmiar…

Faktycznie ustalenie wielkości tablicy pomogło. Dzięki! :slight_smile: