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

SPOJ: Zadanie "Czy umiesz potęgować"

Object Storage Arubacloud
0 głosów
1,063 wizyt
pytanie zadane 4 lipca 2018 w SPOJ przez programista171 Nowicjusz (180 p.)
zmienione kategorie 5 lipca 2018 przez Patrycjerz

Witam,

Napiszę na wstępie, że zdaje sobie sprawę, że umieszczanie gotowych kodów jest niemile widziane, ale wykorzystałem już wszystkie możliwości.

Sędzia nie uznał mi jeszcze żadnego zadania, a próbowałem wrzucić kilkanaście. Zdecydowałem się spytać Was o zadanie "Czy umiesz potęgować", bo jest naprawdę banalne. Myślę, że każdy potrafi je zrobić.

Funkcji pow użyłem, bo podobno jest najszybsza, z racji tego, że napisana w Asemblerze. Wcześniej wypisywałem wynik za pomocą cout, ale zmieniłem na printf... Bez rezultatów.

#include <iostream>
#include <cstdio>
#include <math.h>
using namespace std;
int main() {
		short n,i=1;
		long long int a,b,pot;
		cin>>n;
		while(i<=n) {
				cin>>a>>b;
				pot=pow(a, b);
				printf("%d", pot%10);
				i++;
			}
		return 0;
	}

Proszę uprzejmie o pomoc.

6 odpowiedzi

0 głosów
odpowiedź 4 lipca 2018 przez Pabiak Gaduła (4,450 p.)
Zrób 1000000 do potęgi 1000000. Twój program będzie bardzo długo liczył a przecież masz limit czasu na spoju. Musisz znaleźć jakąś zasadę tyle podpowiem.
0 głosów
odpowiedź 4 lipca 2018 przez 99xkubax99 Obywatel (1,780 p.)
Ze względu na to, że dane wejściowe mogą być bardzo duże, nie ma sensu wykonywania operacji potęgowania, spróbuj na to spojrzeć w inny sposób. W zadaniu pytają jedynie o ostatnią cyfrę, musisz wpaść na pewną zależność, rozpisz sobie na kartce jak zachowują się dane liczby podniesione do kilku kolejnych potęg (dla małych liczb, aby było to widoczne) i zobacz co się będzie działo z ostatnimi cyframi.
0 głosów
odpowiedź 4 lipca 2018 przez programista171 Nowicjusz (180 p.)
edycja 4 lipca 2018 przez programista171

Zgodnie z sugestiami zedytowałem swoje rozwiązanie. Nadal jednak jest błąd.

#include <iostream>
#include <cstdio>
#include <math.h>
using namespace std;
int main() {
		short r,n,i=1;
		long long int a,b,pot;
		cin>>n;
		while(i<=n) {
				cin>>a>>b;
if(b==0)
cout<<1;
else if(a%10==0)
						cout<<0;
				else {
						r=b%4;
						if(r==0)
							r=4;
						pot=pow(a, r);
						printf("%d", pot%10);
					}
				i++;
			}
		return 0;
	}

 

komentarz 4 lipca 2018 przez 99xkubax99 Obywatel (1,780 p.)
Zrób to "ręcznie", bez używania funkcji pow(), ponieważ dla odpowiednio dużego a, rzędu 10^10 podniesione do potęgi 4 da na tyle dużą liczbę, że ciężko będzie mówić o precyzji z dokładnością do cyfry jedności. Zauważ, że w zależności od tego jaka cyfra jest na końcu, trzeba rozpatrzyć inne przypadki. Kolejne potęgi dwójki to 2, 4, 8, 16, 32, 64, więc ostatnie cyfry to 2, 4, 8, 6, 2, 4... Widzisz już jakąś zależność? Pamiętaj, że nie dla każdej ostatniej cyfry jest taka sama częstość powtarzania się cyfr.
0 głosów
odpowiedź 5 lipca 2018 przez Bondrusiek Maniak (61,370 p.)

Witam,

tak jak już przedmówcy powiedzieli nie możesz tego liczyć bezpośrednio gdyż obliczenia będą trwać za długo. Musisz zauważyć pewne zależności wśród potęg. Możesz wykluczyć obliczenia obserwując wyniki potęgowania. Np

dla 5) 5 5*5 = 25 5*5*5 = 125 5*5*5*5 = 625 -> tutaj na końcu jest 5 i jak pomnożysz przez 5 zawsze będzie 5

dla 6) 6 6*6 = 36 6*6*6 = 216 6*6*6*6 = 1296 -> można zauważyć że na końcu zawsze jest 6

dla 1) 1 1*1 = 1 1*1*1 = 1 1*1*1*1 = 1 -> łatwo znaleźć zależność.

Twój kod po małym tuningu dla tych trzech powyższych wartości.

#include <iostream>
#include <cstdio>
#include <math.h>
using namespace std;
int main() {
        short n,i=1;
        long long int a,b,pot;
        cin>>n;
        while(i<=n) {
                cin>>a>>b;
                if( a == 1)
                {
                    printf("1\n");
                }
                else if( a == 5){
                    printf("5\n");
                }
                else if( a == 6)
                {
                    printf("6\n");
                }
                i++;
            }
        return 0;
   }

Polecam rozpisać sobie resztę na kartce i znaleźć podobieństwa.

0 głosów
odpowiedź 6 lipca 2018 przez karmel222 Nowicjusz (200 p.)

Podepnę się pod pytanie bo jest tag C++ a w sumie nie ma sensu zakładać nowego tematu. 

#include <iostream>
int pow (long int x, long int y)
{
	if(y==0) return 1;
	else return pow(x,y-1)*x;
}
int main()
{
	long int x,y,d;
	std::cin>>d;
	for(int i=0; i<d; i++)
	{
		std::cin>>x,y;
		if(y!=4) y= y%4;
		std::cout<<pow(x, y)% 10<<std::endl;
	}
	return 0;
}

Napisałem taki oto kod ale wciąż zwraca mi błędną odpowiedź jakieś sugestie?

1
komentarz 6 lipca 2018 przez niezalogowany
Przeczytać wszystkie odpowiedzi jakie padły.
0 głosów
odpowiedź 10 lipca 2018 przez Dominik Kostencki Użytkownik (650 p.)
#include <iostream>
#include <string>
#include <sstream>
 
 
 
using namespace std;
 
int t,a,b,dlugosc;
string number;
 
int main()
{
    cin>>t;
 
    for(int i=1 ; i<=t ; i++)
    {
        cin>>a>>b;
 
        stringstream liczba;
        liczba<<a;
        string number = liczba.str();
 
        int dlugosc = number.length();
 
        if(number[dlugosc-1]=='0') cout<<"0"<<endl;
        else if(number[dlugosc-1]=='1') cout<<"1"<<endl;
        else if(number[dlugosc-1]=='5') cout<<"5"<<endl;
        else if(number[dlugosc-1]=='6') cout<<"6"<<endl;
 
        if((number[dlugosc-1]=='4')&&(b%2==0)) cout<<"6"<<endl;
        else if((number[dlugosc-1]=='4')&&(b%2!=0)) cout<<"4"<<endl;
 
        if((number[dlugosc-1]=='9')&&(b%2==0)) cout<<"1"<<endl;
        else if((number[dlugosc-1]=='9')&&(b%2!=0)) cout<<"9"<<endl;
 
        if(number[dlugosc-1]=='2')
           {
               if(b==1) cout<<"2"<<endl;
               else if(b%4==0) cout<<"6"<<endl;
               else if((b+1)%4==0) cout<<"8"<<endl;
               else if((b+2)%4==0) cout<<"4"<<endl;
               else cout<<"2"<<endl;
           }
 
           if(number[dlugosc-1]=='3')
           {
               if(b==1) cout<<"3"<<endl;
               else if(b%4==0) cout<<"1"<<endl;
               else if((b+1)%4==0) cout<<"7"<<endl;
               else if((b+2)%4==0) cout<<"9"<<endl;
               else cout<<"3"<<endl;
           }
 
           if(number[dlugosc-1]=='7')
           {
               if(b==1) cout<<"7"<<endl;
               else if(b%4==0) cout<<"1"<<endl;
               else if((b+1)%4==0) cout<<"3"<<endl;
               else if((b+2)%4==0) cout<<"9"<<endl;
               else cout<<"7"<<endl;
           }
 
           if(number[dlugosc-1]=='8')
           {
               if(b==1) cout<<"8"<<endl;
               else if(b%4==0) cout<<"6"<<endl;
               else if((b+1)%4==0) cout<<"2"<<endl;
               else if((b+2)%4==0) cout<<"4"<<endl;
               else cout<<"8"<<endl;
           }
 
}
 
    return 0;
}

Musisz znaleźć zasadę, która pozwoli ci wyznaczać ostatnie liczby bez potrzeby potęgowania ze sobą bardzo dużych liczb. Zamieszczam kod z poprawna odpowiedzią na górze gdybyś jednak potrzebował jakiejś małej podpowiedzi. Pozdrawiam

komentarz 10 lipca 2018 przez niezalogowany
Bez sensu, bo to on powinien sam zauważyć zależność i zaimplementować. Poza tym da się skrócić co najmniej 3 razy i zrobić bez stringstream (wystarczy %10, %4 i tablica).
komentarz 10 lipca 2018 przez Dominik Kostencki Użytkownik (650 p.)
edycja 10 lipca 2018 przez Dominik Kostencki
Pomyślałem, że kod może być pomocny, a co do długości kodu to celna uwaga, bo też sie dopiero uczę.

Podobne pytania

0 głosów
3 odpowiedzi 569 wizyt
0 głosów
1 odpowiedź 152 wizyt
pytanie zadane 3 listopada 2018 w C i C++ przez Maciej3206 Użytkownik (570 p.)
0 głosów
1 odpowiedź 281 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!

...