No i się mieści
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] = ?
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ć?
Dziękuje @mariusz193 Poprawiłem, zadziałało, zaliczyło zadanie.
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
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:
- https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html6
- 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)
Suggested Topics
Topic | Category | Replies | Views | Activity |
---|---|---|---|---|
MBPROB01 - History version in plaintext pl.spoj.com | Zbiór zadań | 6 | 177 | Jul '24 |
FR_20_02 - Poszukiwacze skarbów - Błąd w testach? | Zbiór zadań | 1 | 99 | Apr 2 |
PP0504B - StringMerge - w języku C | Zbiór zadań | 5 | 207 | Jun '24 |
TFRACAL - Kalkulator ułamków | Zbiór zadań | 2 | 145 | Feb 1 |
TOPSORTL - Porządek leksykograficzny w grafie | Zbiór zadań | 3 | 149 | Jul '24 |