• 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
162 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,290 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,290 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ź 177 wizyt
pytanie zadane 2 grudnia 2016 w C i C++ przez wojownikpoeta Nowicjusz (140 p.)
0 głosów
1 odpowiedź 784 wizyt
0 głosów
2 odpowiedzi 293 wizyt
pytanie zadane 28 maja 2019 w C i C++ przez inc0gnito Początkujący (260 p.)

92,555 zapytań

141,402 odpowiedzi

319,544 komentarzy

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

...