121 / 237
Feb 2017

Pisanie programu zaczynamy od myślenia, jeżeli ktoś ma z tym problemy (lub problem trudny), to może sobie pomóc używając kartki i ołówka.

W przypadku kłopotów najpierw czytamy wątek/wątki poświęcone temu zadaniu (najczęściej jest już tam odpowiedź), dopiero później piszemy.

  1. Zastanów się jakie mogą być maksymalne dane wejściowe . Dla liczby 2 do potegi Miliard przy założeniu że miliard razy w pętli mnożysz nie zmieści się w czasie . ( zapewne dlatego dostawałeś komunikat o przekroczeniu czasu - zrób u siebie test na duże liczby ) .

  2. Za mały zakres danych - standartowych typach danych można przechowywać liczby z pewnego zakresu , ale nawet największy typ danych nie przechowa 1 miliard do potęgi miliarda ( niektóre języki programowania mają wbudowaną obsługę dużych liczb ) . Na taką liczbe zabrakło by pamięci na serwerze na którym jest uruchomiony .

  3. Liczby zmiennoprzecinkowe jakie używasz w kodzie powyżej są reprezentowane są w szczególny sposób w pamięci komputera . Można za ich pomocą wyrazić bardzo dużą liczbe ale dzieje się to kosztem jej dokładności na miejscach mniej znaczących , Double z zapisaną liczbą 10 do potęgi 300 nie możesz potraktować moduło 10 -- bo taka liczba ma około 15 cyfr ( początkowych ) w zapisie dziesiętnym ( na których się wykonuje operacje ) a informacja z dalszych ( w tym ostatnich ) pozycji rozwinięcia dziesiętnego została utracona .

Zrób na swoim komputerze i sprawdź co zwraca kod

re = pow(a, b);
re = fmod(re,10);
cout << re << endl;

dla coraz większych liczb: a ^ b
2^ 10
2^ 11
2^ 12
....
2^100
2^101
.....
2^200
2^201

( Edytor frumo coś szaleje - nie pozwala mi wyliczać punktów - i odlicza znowu od 1 a powinno być 4 )

  1. Zastanów się jak szybko potęgować . Np : czy 5 do potęgi 32 trzeba 32 razy mnożyć aby otrzymać prawidłowy wynik .

  2. Operacje moduło ( arytmetyka moduło ) też charakteryzuje pewna powtarzalność .

  3. Nie możesz zrobić tego zadania bo zapewne nie wiesz o dwóch sztuczkach jakie trzeba znać i umiejętnie zastosować .

28 days later

`#include

using namespace std;
int x,y,test,ilo=1;

int main() {
cin >>test;
for (int i=0;i<test;i++)
{
cin >>x>>y;
for(int g=0;g<y;g++)
{
ilo*=x;
ilo%=10;
}
cout << ilo<< endl;
ilo=1;
}

return 0;

}`

Wywala błąd, nie wiem co zmienić ;-;. Jakaś wskazówka?

Sprawdź swój out dla przykładowych testów.
Poza tym wszystkie potrzebne informacje do rozwiązania tego zadania są już zebrane w tym temacie, pozostaje tylko zastosować :wink:

10 days later

Siema. Podłączam się do tematu.
Mianowicie mam napisany program, wszystko ładnie liczy, testowane na wszystkie mozliwe sposoby (ponizej link do ideone), ale sędzia nadal krzyczy, ze błędne rozwiązanie.
Wiem, że da się to rozwiązać troche krócej poprzez zastosowanie tablicy, ale chciałbym wiedzieć gdzie ja popełniłem błąd.

https://ideone.com/P1I0JZ17

In

1
10 2

Poprawny out

0

Zauważyłeś co trzeba, tylko powywalaj teraz te ify (uprzedzając, switch-case to też if). Nie dodawaj żadnej tablicy, tylko pomyśl nad zgrabniejszym algorytmem.

12 days later

Może przestań potęgować, komputer potrafi wiele, ale podności miliard do potegi o wykladniku miliard to bezsens, nawet sobie nie wyobrażam, ile to by musiałobyć znaków w konsoli :slight_smile:

25 days later

Mam problem z wprowadzaniem błędnych danych i chyba przez to mój program wyrzuca błąd "Błędna odpowiedź".

W treści zadania jest napisane:
"W pierwszej linii wejścia znajduje się jedna liczba całkowia D (1≤D≤10), oznaczjąca liczbę przypadków do rozważenia. Opis każdego przypadku podany jest w jednym wierszu, zawierającym dwie liczby naturalne a i b oddzielone pojedynczym odstępem (spacją), takie, że (1 ≤ a,b ≤ 1 000 000 000)."

Więc zrobiłem ograniczenia na wejściu tzn:

 do
            {
                D = Convert.ToInt32(Console.In.ReadLine());
            } while (1 > D || D > 10);

oraz

do
                {
                    ab = Console.In.ReadLine();
                    a1 = Convert.ToInt32(ab.Substring(0, ab.IndexOf(' ') + 1));
                    b = Convert.ToInt32(ab.Substring(ab.IndexOf(' ') + 1));
                } while (1 > a1 || a1 > 1000000000 || 1 > b || b > 1000000000);

, tak aby po wpisaniu złych danych, pętla sprawdzała warunki i w wypadku wprowadzenia złych danych, zaczynała wczytywanie jeszcze raz, tak aby nie było możliwości wprowadzenia złych danych. Czy to podejście jest niepoprawne w kontekście testów wykonywanych przez sędziego? Bo za każdym razem jak podaję nawet bardzo wielkie liczby, ale mieszczące się w założeniach to na ideone.com program działa i wyniki są poprawne. Oczywiście program korzysta z zasady wyznaczania ostatniej cyfry a nie z potęgowania :slight_smile:

Na spoj wszystkie dane wejściowe są zgodne z specyfikacją podaną w danym zadaniu. Twoje ograniczenia wejścia są zatem zbędne.

8 days later

nie wiem - ja uruchomiłem ten kod i jest AC

usuń link do kodu z twojego postu (źle wstawiony, nawiasem mówiąc)

kod lepiej jest przekazywać poprzez link do ideone.com6

Dzisiaj wkleiłem dokładnie ten sam kod i działa, a nie zmieniałem nic. Wczoraj jeszcze nie działał. Dziwne.

Tak, jak pisałem poprzednio, usuń link do programu - niech inni mają szansę na samodzielne rozwiązanie problemu :slight_smile:

Nie używaj zmiennych globalnych i funkcji endl. Nie wiem po co ci nowa linia po każdym cin.

Przeglądnij ten temat jeszcze raz, z funkcją pow sędzia i tak ci wypluje 'przekroczony limit czasu'. Najlepiej wypisz sobie na kartce 10 pierwszych potęg każdej z liczb i wtedy napisz program jeszcze raz

Cześć
Da się jakoś przyspieszyć mój program żeby mieścił się w czasie, czy lepiej napisać innym sposobem?
Co powinno się stać jeśli spróbuję rozważyć np.12 przypadków, w zadaniu jest max 10?

#include <iostream>
#include <math.h>

using namespace std;

int a[9],b[9], D;
long long potega;

int main()
{
    cin >>D;
    cout << endl;

    for(int c=0; c<D; c++)
    {
        cin >> a[c];
        cin >> b[c];
        cout << endl;
    }
    for(int c=0; c<D; c++)
    {

        a[c]=a[c]%10;
        if(b[c]==0)         cout << 1 <<endl;
        else
        {
            if(b[c]%4==1)
            {
                b[c]=1;
            }
            else if(b[c]%4==2)
            {
                b[c]=2;
            }
            else if(b[c]%4==3)
            {
                b[c]=3;
            }
            else if(b[c]%4==4)
            {
                b[c]=4;
            }
            else if(b[c]%4==0)
            {
                b[c]=4;
            }
            potega = pow(a[c], b[c]);

            cout << potega%10 <<endl;
        }
    }
    return 0;
}