17 / 25
Dec 2014

BlueMary struggled with optimizing this solution in another thread. If they struggled with it, I don't stand a chance.
Search for CRYPTO4. It's easier for us to find the problem you're discussing if you reference the problem using it's code (CRYPTO4)

Good luck.

Hey leppy,
Thanks but unfortunately I can't find any such thread. Could you please give the link to the thread. Search is not showing anything frowning

Zauważyć, że skoro potrzebujemy tylko wynik modulo 10, to potęgi szybko zaczną się powtarzać, np. dla dwójki mamy 1-> 2->4->8->6->2->4->8->6 itd

Ewentualnie można problem rozwiązać ogólniej za pomocą algorytmu szybkiego (binarnego) potęgowania ;p

1 year later
5 years later

W zadaniu jest Limit pamięci: 1536MB
Dla b równego 1 000 000 000 przy wykonaniu wspomnianej instrukcji system sprawdzający nie pozwala zaalokować ~4000MB.

Można jeszcze jedną rzecz zauważyć (dotyczącą podstawy) - nie widzę tego u Ciebie w kodzie, chyba, że też robisz to w taki zakręcony sposób, jak resztę i nie rzuciło mi się w oczy wink

Nie wiem co dokładnie pokazuje "menedżer zadań" w Windows i co dokładnie sprawdzasz, ale prosta analiza kodu wskazuje, że nie może to być pamięć alokowana przez proces.
windows.microsoft.com/pl-pl/wind ... =windows-7

Ja pod Linuxem sprawdzam zużycie pamięci używając valgrind-a

==29479== Memcheck, a memory error detector
==29479== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==29479== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==29479== Command: ./a.out
==29479== 
1   
1000000000 1000000000
==29479== Warning: set address range perms: large range [0x395a5040, 0x127c57840) (undefined)
0
==29479== Warning: set address range perms: large range [0x395a5030, 0x127c57850) (noaccess)
==29479== 
==29479== HEAP SUMMARY:
==29479==     in use at exit: 24 bytes in 5 blocks
==29479==   total heap usage: 7 allocs, 2 frees, 4,000,000,032 bytes allocated
==29479==

Tak jak się można spodziewać dla wejścia z b=10^9 Twój program alokuje ~4GB pamięci i stąd na spoj-u przekracza limit.

Proponuje zapoznaj się z narzędziami, które pokazują zużycie/alokacje pamięci pod Windows. Znalazłem taki wątek:
stackoverflow.com/questions/4134 ... or-windows2

11 days later

Weź proszę przetestuj swój program. 2 do 2 = 4 - Twój algorytm mówi, że 6. 3 do 3 = 9 - daje mi odpowiedź 1.

Poddaję się. To już kolejny wariant który testuje. Szybciej i krócej nie potrafie. Spoj wskazuję błąd.

[bbone=CPP,2663]

include

include

using namespace std;

int ostatnia(int liczba)
{
int wynik=0;
wynik = liczba % 10; // pobiera cyfrę
liczba = liczba / 10; // obcina liczbę o wybraną cyfrę
return(wynik);
}

int main()
{
int ile,b;
int liczba,potega;
double wynik;

cin>>ile;
for(int i=0;i<ile;i++)
{
    cin>>liczba>>potega;
    b=ostatnia(liczba);
    wynik=pow(b,potega);
    cout<<ostatnia(wynik)<<endl;
}
return 0;

}
[/bbone]

Tu nie chodzi o to żeby napisać jak najkrócej tylko żeby działało dla zakresów podanych w zadaniu. Na forum było pisane o tym problemie w tym zadaniu wiele razy - wystarczy poszukać. Test:

1
999999999 1000000000

Poprawna odpowiedź to:

1

Twoja odpowiedź:

-8

To nie łatwiej tak:

cin >> liczba;
b = liczba % 10;

względnie tak:

int ostatnia(int liczba)
{
     return liczba % 10;
}

Jeśli wprowadzasz jakąś funkcję pomocniczą, to dobrze, żeby rzeczywiście pomagała - czy to wydajnościowo, czy jeśli chodzi o czytelność kodu. W tym przypadku w ogóle się to nie opłaca, bo dochodzi koszt wywołania, ponadto czytający musi skakać po kodzie, żeby zobaczyć, co robi Twoja dodatkowa funkcja.

Dokładnie tak.
Możesz nawet pójść jeszcze jeden albo dwa, trzy kroki dalej:
[bbone=cpp,2260] wynik = pow(liczba % 10, potega);
cout << ostatnia(wynik) << endl;[/bbone]
lub drugi krok:[bbone=cpp,2261] wynik = pow(liczba % 10, potega);
cout << wynik % 10 << endl;[/bbone]
trzeci:
[bbone=cpp,2262]cout << pow(liczba % 10, potega) % 10 << endl;[/bbone]
ale dla zakresu danych z zadania i tak pow się wysypie.

Musisz jeszcze w jakiś sposób "skrócić" wykładnik [potęgę], lub poczytać o szybkim potęgowaniu i możesz na jego bazie [algorytmie] rozwiązać to zadanie..

[tex]30^{30} = 205891132094649000000000000000000000000000000[/tex]

[tex]unsigned\; long\;long < 2^{64} = 18446744073709551616[/tex]

[tex]1\;000\;000\;000^{1\;000\;000\;000} = .............000\;000..........?????[/tex]

Tak, że nie, źle nie napisałeś, ale warto też czytać, także to co trochę wyżej już zostało napisane i warto też zaglądnąć do regulaminu - są tam też podpowiedzi, a nie od razu wrzucać pytanie.

27 days later

Mógłbyś napisać szerzej o co chodzi Ci w tym zdaniu? Bo mam wrażenie, że tutaj coś mieszasz, ale najpierw muszę byc pewny co to w ogóle oznacza stuck_out_tongue

12 months later