Może się mylę, może nie...ale coś mi się wydaje że coś Ci się sypie ze względu na zmienne.
Czy nie ?!
W sensie ze dla wyniku, zwykły int to może być troszkę mały pojemnosciowo jak na tak spory wynik. Czy po prostu sie nie znam ?!
A po za tym nijaki "mariusz" napisał:
w wątku wielokrotnie pisano, dlaczego nie należy używać funkcji pow() - przeczytaj ten wątek i pomyśl - myślenie nie boli (wiem, są wyjątki)(...)
a nie jaki sig napisał:
Wypisz sobie po 10 pierwszych potęg liczb od 1 do 10, i spójrz na ostatnie cyfry.
Ja jeszcze skrobie swój kodzik dlatego tak mało pewnie...
Aktualnie walczę z innym problemem. Przekraczam limit czasowy. Czytałem post i zauważyłem zależności miedzy potęgami. Wydaje mi się że nie jest to jedyny sposób na rozwiązanie tego zadania. http://ideone.com/n3B6uO35 oto mój kod. Jak masz jakieś pomysły jak go przyspieszyć by się mieścił w limicie czasowym to słucham
Nikt inny raczej tego nawet nie czyta, a tym bardziej jeżeli nie chciałby pomóc.
PS
Beznadziejny przypadek - chodziło o to, że twojego sposobu nie da się przyśpieszyć, nawet jak poczytasz o szybkim potęgowaniu, to twój kod wymaga zbyt dużo poprawek - a chyba chodzi tu też o odrobinę samodzielności, czyż nie?
A szkoda, bo każdy szukający tu pomocy, powinien zawsze najpierw poczytać wątek/[a nawet wątki] poświęcone problemowemu zadaniu. Np: http://discuss.spoj.com/search?q=czy%20umiesz%20pot%C4%99gowa%C4%87 + [plus] http://213.192.104.217/phpBB3-spoj-pl-backup/viewtopic.php?f=1&t=222&hilit=czy+umiesz+pot%C4%99gowa%C4%87&sid=689abcabeb3c4142e274150b75303a4313 a dopiero potem, jeżeli nie znajdzie odpowiedzi, zadawać tu swoje pytanie/a...
Ja Ci podpowiem. Rzeczywiście masz sporo błędów, co nie oznacza, że jesteś głupi, ale przydałoby Ci się trochę lepiej poznać język C++. Może jakaś książka, żeby ugruntować sobie wiedzę? Albo po prostu więcej uwagi, jeśli wiedzę masz. Pierwsze co mi się rzuciło, to w treści zadania masz napisane, że wszystkie dane wejściowe są liczbami całkowitymi. Potem operacje, które na nich wykonujesz dotyczą liczb całkowitych(modulo, dodawanie, mnożenie itp). Wyjścia też są liczbami całkowitymi(cyfra jedności wyniku a^b, gdzie a i b są liczbami całkowitymi dodatnimi). W związku z tym nie należy się spodziewać, by w programie przydały się liczby zmiennoprzecinkowe. Twoje zmienne a i b zadeklarowałeś jako typu double, czyli zmiennoprzecinkowe o podwójnej precyzji, a nie poszerzony zakres int(a przypuszczam, że o to Ci mogło chodzić). Jeśli chodzi o sposób na obliczenie cyfry jedności zauważ, że dla np b=1000000000, instrukcje z pętli będą wykonywały się miliard razy, a limit czasowy wynosi 0.529 sekundy. Nie znam się za bardzo na przełożeniu złożoności obliczeniowej na czas wykonywania, ale już nawet na pierwszy rzut oka taki przypadek śmierdzi baaaardzo długim czasem wykonywania, powyżej 0.529s. Sama idea funkcji nie jest zła. Jeśli chodzi o samo skrócenie czasu wykonywania- gdzieś w temacie wcześniej było poruszone, ale powtórzę podpowiedź: Rozpisz sobie pierwszych 6 potęg liczby 2, zaczynając od 2^1, a kończąc na 2^6 i postaraj się zauważyć powtarzającą się prawidłowość w wyniku w rzędzie jedności. Jeśli nie będziesz w stanie rozwiązać tego zadania po staraniach, prześledź temat, wgryź się w cudze kody i zobaczysz w czym rzecz. Powodzenia:)
Tak, z tym, że wyniki rzędu jedności potęg nie wszystkich cyfr powtarzają się co 4, ale więcej nie napiszę, żeby Ci nie zabierać frajdy i satysfakcji z samodzielnego dochodzenia do rozwiązania. Co do tego jedynego sposobu na rozwiązanie, ten jest jedynym działającym, z którym się spotkałem(pisząc i potem patrząc w parę kodów tutaj), ale może są jakieś inne. Jeśli chodzi o to "czytanie książki", to się powtórzę, ale polecam, z autopsji. Obecnie czytam symfonię c++ i choć na pierwszy rzut oka wszystkie poruszane tematy są oczywiste, co chwila się czegoś dowiaduję czytając to. Trochę się pomądrowałem, ale może znajdziesz w tej wypowiedzi przydatne dla siebie rzeczy. Pozdro:)
Może mi ktoś powiedzieć, czy moje rozwiązanie jest dobre... Tzn testy przechodzą, ale nie wiem czemu dopiero przy zmodulowaniu wykładnika przez 20 testy przechodzą... Czy okres liczby jedności w wszystkich potęgach jest 20 lub jego dzielnikiem?
Summary
include
using namespace std;
long long int pot(int a,int b)
{
if(b==1)return a%10;
else return (a*pot(a,b-1))%10;
}
int main()
{
int x,y,z;
cin>>x;
for(int i=0;i<x;i++)
{
cin>>y>>z;
y=y%10;
z=z%20;
if(z!=0)cout<<pot(y,z)<<endl;
else cout<<"1"<<endl;
}
return 0;
}
Co jest złego z tym kodem? (Jeśli zamierzasz odpowiedzieć poczytaj u góry to oszczędź klawiatury i nie odpisuj ;] )
include
include
using namespace std;
unsigned long long a,b,temp,wynik,ile;
int main()
{
cin>>ile;
for(unsigned int i=1; i<=ile; i++)
{
cin>>a>>b;
temp=pow(a,b);
if(b==1)
{
wynik=a;
}
if (b==0)
{
wynik=1;
}
else{
wynik=temp%10;
}
cout<<wynik;
}
return 0;
}
`
nic nie jest złego - tyle, że poprawnie rozwiązuje tylko niewielki podzbiór możliwych zestawów danych
oczywiście informacja, dlaczego tak się dzieje jest gdzieś powyżej w tym wątku.
z twojego komentarza rozumiem, że nie masz czasu, aby przeczytać cały wątek (lub nie rozumiesz co czytasz)
ja natomiast nie mam czasu po raz n-ty tłumaczyć podstawowych rzeczy
pozdrawiam, i życzę powodzenia
Czy mógłby ktoś mi podpowiedzieć dlaczego sędzia nie akceptuje takiego rozwiązania? Dla jakiego przypadku działa niepoprawnie?
zwykłe lenistwo, zamiast uruchomić prosty przykład na ideone49, łatwiej od razu na forum zadać pytanie ?