• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czy umiesz potęgować? SPOJ

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
1,005 wizyt
pytanie zadane 31 stycznia 2021 w C i C++ przez Rainbow99 Początkujący (430 p.)
edycja 1 lutego 2021 przez Rainbow99

Mam problem w tym zadaniem: https://pl.spoj.com/problems/PA05_POT/. W CodeBlocksie na oko wszystko jest okej, ale SPOJ pokazuje błędną odpowiedź. Z czego może to wynikać?

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

using namespace std;

int testy, dlugosc;
int a, b;
int main()
{
    cin>>testy;
    for (int i=0; i<testy; i++)
    {
        cin>>a>>b;
        std::string ostatnia_cyfra=std::to_string(pow(a, b));
        dlugosc=ostatnia_cyfra.length();
        cout<<ostatnia_cyfra[dlugosc-8]<<endl;
    }
    return 0;
}

Kod po edycji-----------------------------------------------------------------------------------------------------

#include <iostream>
#include <string>

using namespace std;

int testy, dlugosc1, b;
string a;
int main()
{
    cin>>testy;
    for (int i=0; i<testy; i++)
    {
        cin>>a>>b;
        dlugosc1=a.length();
        switch (a[dlugosc1-1])
        {
        case '0':
        {
            cout<<"0"<<endl;
        }
        case '1':
        {
            cout<<"1"<<endl;
            break;
        }
        case '2':
        {
            if((b-1)%4==0)
                cout<<"2"<<endl;
            else if((b-2)%4==0)
                cout<<"4"<<endl;
            else if((b-3)%4==0)
                cout<<"8"<<endl;
            else
                cout<<"6"<<endl;
            break;
        }
        case '3':
        {
            if((b-1)%4==0)
                cout<<"3"<<endl;
            else if((b-2)%4==0)
                cout<<"9"<<endl;
            else if((b-3)%4==0)
                cout<<"7"<<endl;
            else
                cout<<"1"<<endl;
            break;
        }
        case '4':
        {
            if ((b-1)%2==0)
                cout<<"4"<<endl;
            else
                cout<<"6"<<endl;
            break;
        }
        case '5':
        {
            cout<<"5"<<endl;
            break;
        }
        case '6':
        {
            cout<<"6"<<endl;
            break;
        }
        case '7':
        {
            if((b-1)%4==0)
                cout<<"7"<<endl;
            else if((b-2)%4==0)
                cout<<"9"<<endl;
            else if((b-3)%4==0)
                cout<<"3"<<endl;
            else
                cout<<"1"<<endl;
            break;
        }
        case '8':
        {
            if((b-1)%4==0)
                cout<<"8"<<endl;
            else if((b-2)%4==0)
                cout<<"4"<<endl;
            else if((b-3)%4==0)
                cout<<"2"<<endl;
            else
                cout<<"6"<<endl;
            break;
        }
        case '9':
        {
            if ((b-1)%2==0)
                cout<<"9"<<endl;
            else
                cout<<"1"<<endl;
            break;
        }

        }
    }
    return 0;
}

 

1
komentarz 1 lutego 2021 przez j23 Mędrzec (195,240 p.)

Wypisz sobie w jakimś arkuszu kalkulacyjnym wyniki dla zakresów [0,10] wartości a i b. Znajdź prawidłowości.

Funkcja pow nie jest Ci tutaj do niczego potrzebna (zresztą i tak by nie zdała egzaminu przy tych zakresach). Wystarczy tablica 2d z przeliczonymi wartościami i operacje modulo.

5 odpowiedzi

+2 głosów
odpowiedź 31 stycznia 2021 przez Michałełe Nałogowiec (25,600 p.)
wybrane 1 lutego 2021 przez Rainbow99
 
Najlepsza
W tym zadaniu na pewno nie chodzi o to, żeby liczczyć sobie tą potęgę i po prostu wypisywać.

Podpowiedź:

Rozpisz sobie liczby i wypisuj kolejne ich potęgi
+1 głos
odpowiedź 31 stycznia 2021 przez Kabuuz Bywalec (2,820 p.)
Skąd wzięło się to "długosc-8"? Chodziło o "dlugosc-1"? Nie musisz tego konwertować jeśli użyjesz operacji modulo (działa tylko na liczbach całkowitych) i to pozwoli wyciągnąć ostatnią cyfrę.

Ogólnie niepokoją mnie zakresy a i b bo to może wyjść poza zakres czegokolwiek. Więc musisz pomyśleć jak to sprytnie zrobić.
+1 głos
odpowiedź 31 stycznia 2021 przez SzkolnyAdmin Szeryf (89,770 p.)
Na pewno nie potęguj, ponieważ maksymalnie będzie to 10^10. Pomyśl, jakie mogą być ostanie cyfry kolejnych potęg.

Twój zakres: podstawy od 1 do 10, wykładniki tez od 1 do 10 (w obu przypadkach liczby naturalne)

Na przykład: 1 do dowolnej potęgi = 1. Czyli dla podstawy 1 zawsze cyfrą jedności będzie 1.

2^1=2, 2^2=4, 2^3=8, 2^4=16, 2^5=32, itd.

...

10 do dowolnej potęgi z zakresu da ci liczbę z zerem na końcu.

Może tablica dwuwymiarowa?
0 głosów
odpowiedź 1 lutego 2021 przez Rainbow99 Początkujący (430 p.)

Hmm... Zrobiłem to z operacjami modulo i casem, ale SPOJ nadal jest nieugięty

#include <iostream>
#include <string>

using namespace std;

int testy, dlugosc1, b;
string a;
int main()
{
    cin>>testy;
    for (int i=0; i<testy; i++)
    {
        cin>>a>>b;
        dlugosc1=a.length();
        switch (a[dlugosc1-1])
        {
        case '0':
        {
            cout<<"0"<<endl;
        }
        case '1':
        {
            cout<<"1"<<endl;
            break;
        }
        case '2':
        {
            if((b-1)%4==0)
                cout<<"2"<<endl;
            else if((b-2)%4==0)
                cout<<"4"<<endl;
            else if((b-3)%4==0)
                cout<<"8"<<endl;
            else
                cout<<"6"<<endl;
            break;
        }
        case '3':
        {
            if((b-1)%4==0)
                cout<<"3"<<endl;
            else if((b-2)%4==0)
                cout<<"9"<<endl;
            else if((b-3)%4==0)
                cout<<"7"<<endl;
            else
                cout<<"1"<<endl;
            break;
        }
        case '4':
        {
            if ((b-1)%2==0)
                cout<<"4"<<endl;
            else
                cout<<"6"<<endl;
            break;
        }
        case '5':
        {
            cout<<"5"<<endl;
            break;
        }
        case '6':
        {
            cout<<"6"<<endl;
            break;
        }
        case '7':
        {
            if((b-1)%4==0)
                cout<<"7"<<endl;
            else if((b-2)%4==0)
                cout<<"9"<<endl;
            else if((b-3)%4==0)
                cout<<"3"<<endl;
            else
                cout<<"1"<<endl;
            break;
        }
        case '8':
        {
            if((b-1)%4==0)
                cout<<"8"<<endl;
            else if((b-2)%4==0)
                cout<<"4"<<endl;
            else if((b-3)%4==0)
                cout<<"2"<<endl;
            else
                cout<<"6"<<endl;
            break;
        }
        case '9':
        {
            if ((b-1)%2==0)
                cout<<"9"<<endl;
            else
                cout<<"1"<<endl;
            break;
        }

        }
    }
    return 0;
}

 

1
komentarz 1 lutego 2021 przez Great Stary wyjadacz (12,660 p.)
Brakuje break dla case '0'. Sprawdź czy teraz będzie działać.
komentarz 1 lutego 2021 przez Rainbow99 Początkujący (430 p.)
Hahah. W programowaniu trzeba być jednak spostrzegawczym :) Dzięki!
0 głosów
odpowiedź 3 lutego 2021 przez lobo.guru Obywatel (1,920 p.)
Wyjaśniam to na tym filmie:

https://www.youtube.com/watch?v=quIWMV3XdxU

Podobne pytania

0 głosów
0 odpowiedzi 673 wizyt
pytanie zadane 28 października 2021 w C i C++ przez DrTomas Nowicjusz (140 p.)
+1 głos
1 odpowiedź 2,467 wizyt
+1 głos
2 odpowiedzi 1,394 wizyt

93,443 zapytań

142,434 odpowiedzi

322,691 komentarzy

62,805 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

...