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

SPOJ Czy umiesz potegowac - nie przekraczam czasu i bledna odpowiedz

Cloud VPS
0 głosów
232 wizyt
pytanie zadane 9 września 2022 w C i C++ przez Nahlfar Nowicjusz (220 p.)

Nowy na forum. Dopiero zacząłem pisać w C++. Zadanie znane, ale tutaj link do treści na wszelki wypadek: SPOJ. Rozumiem zadanie i wiem, że nie mogę potęgować wprost. Znalazłem zależności i je przetestowałem, a jednak sędzia pisze o błędzie. Domyślam się, że nie spełniam jakiegoś warunku brzegowego.. Tylko którego? Proszę o pomoc.

    int D, a, b, wynik;
    cin >> D;
    if (D < 11 && D >0)
    {
        while (D > 0)
        {
            D--;
            cin >> a >> b;
            wynik = a % 10;
            b = b % 4 + (4 * (b % 4 == 0));
            if ((wynik > 1 && wynik < 5) || wynik > 6) for (int i = 2; i <=b; i++)   wynik = (wynik * a) % 10;
            cout << wynik << endl;
        }
    }

 

1 odpowiedź

0 głosów
odpowiedź 9 września 2022 przez Oscar Nałogowiec (29,360 p.)
wybrane 9 września 2022 przez Nahlfar
 
Najlepsza

W linii 11 (swoją drogą podziliłbym ją - if, for i samo działanie w jednej linii to trochę za dużo) masz operację:

wynik = (wynik * a) % 10;

Zmienna wynik jest jednocyfrowa, nie ma z nią problemu, ale a może przyjąć wartość miliarda, a na 32 bitowych (jakie tam jest środowisko?) liczbach można liczyć tylko do 2-4miliardów (ze znakiem i bez). Pewnie algorytm wariuje gdy a jest skrajnie duże.

 

 

PS. Tak ogólnie musisz się trochę oswoić z takim informatycznym myśleniem - jeśli w traści zadania/założeniach projektowych jest napisane że coś na działać dla danych np. od jeden do stu to na te skrajne wartości zawsze należy soft przetestować. Oczywiście jeszcze trzeba też inna wartości użyć, ale te skrajne są "na bank".

komentarz 9 września 2022 przez Nahlfar Nowicjusz (220 p.)

Dzięki za podpowiedź. Na moim kompie działało nawet przy 999999999 do potęgi 999999999, więc testowałem nawet największe liczby z zadania.

Natomiast na SPOJ nie chodziło. Ale wystarczyła mała zmiana kodu. Nowa formuła:

wynik = (wynik * (a%10)) % 10

i teraz SPOJ przyjął :)

Dziękuję jeszcze raz! :)

komentarz 10 września 2022 przez Oscar Nałogowiec (29,360 p.)
Może masz system 64 bit (w C wielkość poszczególnych typów nie jest określona, ustalone są tylko miękkie zależności - co jest większe a co mniejsze) a w spoju uruchamiane jest w 32 bit.

Podobne pytania

0 głosów
1 odpowiedź 211 wizyt
pytanie zadane 2 grudnia 2016 w C i C++ przez wojownikpoeta Nowicjusz (140 p.)
0 głosów
1 odpowiedź 975 wizyt
0 głosów
2 odpowiedzi 599 wizyt
pytanie zadane 28 maja 2019 w C i C++ przez inc0gnito Początkujący (260 p.)

93,456 zapytań

142,451 odpowiedzi

322,721 komentarzy

62,837 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

Kursy INF.02 i INF.03
...