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

Czy umiesz potęgować? SPOJ

Object Storage Arubacloud
0 głosów
779 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 (194,920 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 (86,360 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,360 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 416 wizyt
pytanie zadane 28 października 2021 w C i C++ przez DrTomas Nowicjusz (140 p.)
+1 głos
1 odpowiedź 1,987 wizyt
+1 głos
2 odpowiedzi 1,060 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...