1 / 5
Mar 2017

Czesc! Tym razem dostaje błędną odpowiedź. Zadanie to:http://pl.spoj.com/problems/PA05_POT/

To zapewne jakiś banalny problem, ale ja go nie mogę dostrzec. Z góry dziękuję za pomoc.

include

include

using namespace std;
int p,w;
int potega(int p,int w)
{
if (w==0) return 1;
else return p*potega(p,w-1);
}
int main()
{
int proby;
cin>>proby;
if(proby<=1||proby>=10)
{
exit(0);
}
else
{

    for(int i=1; i<=proby; i++)
    {
        cin>>p>>w;
        cout<<(potega(p,w))%10<<endl;
    }

}
return 0;

}

  • created

    Mar '17
  • last reply

    Mar '17
  • 4

    replies

  • 437

    views

  • 4

    users

  • 2

    links

Problem banalny nie jest, natomiast występuje błąd w rozumowaniu. Oszacuj sobie ile operacji musi wykonać Twój algorytm by policzyć 1000000000 do potęgi 1000000000, zestaw to z szybkością pracy przeciętnego procesora i będziesz wiedział, że to u Ciebie potrwa wieki. Nie wspominając o tym, że zmienna jaką zastosowałeś bardzo szybko się przepełni.

  1. Polecam stosowanie scanf oraz printf zamiast cout, cin. Są szybsze.
  2. Nie powinno się tworzyć zmiennych globalnych (int p,w)
  3. Jeżeli definicja funkcji potega występuje nad funkcją main, nie ma potrzeby dodatkowego jej deklarowania (int potega(p,w-1))
  4. Z polecenia wiemy, że p,w nie mogą być <1, więc lepiej użyć unsigned int.
  5. W instrukji warunkowej if(proby < = 1 || proby >= 10) powinno być (proby < 1 || proby > 10), w poleceniu jest napisane, że liczba prób zawiera się w przedziale <1,10>.
  6. Twój program od razu po wczytaniu wartości dla p oraz w wyświetla wynik. Powinien najpierw zebrać wartości dla każdej z prób, a dopiero potem je wypisać. Proponuję zapisywać wyniki do tablicy, a potem je wyświetlić.

Dziękuję za wasza pomoc.

1.To teraz tak. Jaka zmienna powinienem zastosować,by to sie wszystko pomieściło. Poniżej użyłem long double.

  1. Na razie zostałem jeszcze z cin i cout, ponieważ tak byłem nauczony od początku, ale zanotowałem w notatkach, że scanf i printf jest lepsze. Dzięki!

  2. W polecniu jest napisane D (1≤D≤10). Czyli włącznie z 1 i 10, prawda? Czy jakbym zrobił to 1<D<10, to wtedy juz chyba 1 i 10 by się nie wliczały.

  3. Czy taki sposob zapisania do tablicy jest poprawny ? Teraz wlasnie w momencie pisania wydaje mi się, że wybrałem skomplikowaną drogę bo mogłem po prostu zapisać wynik do tablicy, a ja to zrobiłem na około. Mimo tego, czy jest to poprawnie wykonane.

Z góry dziekuję za wszelką pomoc i jakiekolwiek wyjaśnienia.

KOD:
https://ideone.com/9D1d1l5

1 nie musisz sprawdzać poprawności danych na wejściu są one zawsze zgodne z treścią polecenia
2 niepotrzebnie korzystasz z tablic aby pobrać wszystkie dane naraz. Możesz pobierać zestawy po kolei i na bieżąco wypisywać odpowiedz
3 Niepotrzebnie używasz typu double, który ma taką pojemność jak int tylko dodatkowo 8 miejsc po przecinku.
dodatkowo wysyłasz je do funkcji która przyjmuje typ unsigned int (chyba coś tu nie tak):

4 po co to?

5

nawet liczba 100^100 ma 200 cyfr żadna zmienna nie pomieści liczby 1000000000^1000000000 (ok. 10^9 cyfr)
musisz to rozwiązać w inny sposób. Wątek był podejmowany wiele razy, przeszukaj forum to na pewno znajdziesz odpowiedz.
zobacz:
http://discuss.spoj.com/search?q=potegowa