• 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

Object Storage Arubacloud
0 głosów
174 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,320 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,320 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ź 181 wizyt
pytanie zadane 2 grudnia 2016 w C i C++ przez wojownikpoeta Nowicjusz (140 p.)
0 głosów
1 odpowiedź 851 wizyt
0 głosów
2 odpowiedzi 327 wizyt
pytanie zadane 28 maja 2019 w C i C++ przez inc0gnito Początkujący (260 p.)

92,681 zapytań

141,583 odpowiedzi

320,070 komentarzy

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

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!

...