PA05_POT - Czy umiesz potęgować
hiko: zadanie c++, spoj
"czy umiesz potegowac"
nie potrafie zrozumiec, dlaczego spoj odrzuca moje rozwiazanie, skoro spełnia warunki(nie
znalazlem jeszcze takiego wejscia, ktory by nie spełniał)
moj kod:
http://ideone.com/TwZt6i
zadanie
http://pl.spoj.com/problems/PA05_POT/
4 lis 10:22
hiko: w skrócie napisałem kod, który wykonuje potęgowanie z podanej liczby b, z tym, ze aby program
nie musiał działac na duzych liczbach i byc za wolnym
zrobiłem b%4 bo wtedy liczba jednosci jest taka sama
4 lis 10:24
jc: 4%4 = 0, 40 = 1, 44 = 256, ale pomysł można wykorzystać, tylko trzeba poprawić.
Może tak
int c = b%4;
if( b > 0 && c > 0) b = c;
−−−−−
Program nie powinien za dużo pisać (nie wiadomo przecież, jak zostaną wykorzystane
wyniki). Nie jest podane ograniczenie liczby danych. Proponuję więc coś takiego
(piszę tylko funkcję main() ):
int main(){
int d;
cin >> d;
for(int i=0;i<d;i++){
int a , b;
cin >> a >> b;
cout << potega(a,b) << endl;
}
}
4 lis 11:07
hiko: o faktycznie! dzieki
poprawiona wersja:
http://ideone.com/IAr2Sr
tylko spoj nie wiem czemu wywala "segmentation fault"
4 lis 11:28
jc: Odłóżmy na razie matematykę.
Po co tworzysz tablicę? Dlaczego nie wypisujesz wyników na bieżąco?
Program będzie krótszy, czytelniejszy, będzie zużywał mniej pamięci
i będzie działał dla dowolnej liczby dawnych.
Po co używasz typu unsigned? Zwykłe int będzie bezpieczniejsze.
4 lis 11:35
hiko: Tworze tablice, bo inaczej miałbym cos takiego:
wejscie: 2 10
wyjscie: 4
wejscie: 3 2
wyjscie 9
a na spoju mam zrobic najpierw wpisywanie danych, i pozniej oddzielnie wyswietlic wyniki
unsigned faktycznie zbędne w owych przypadkach, ewentualnie dopisałbym unsigned do wykładnika i
podstawy potęgi, aby miał większe zakresy
4 lis 11:54
jc: Nic takiego treść zadania nie sugeruje.
Nigdzie nie jest powiedziane, że program ma pamiętać dane wyjściowe, czy też wyjściowe.
Program ma przetworzyć dane.
4 lis 12:08
hiko: racja
poprawiony kod:
http://ideone.com/aOTua3
aczkolwiek nadal nie przechodzi warunków, bo przekracza limit czasu
4 lis 12:10
hiko: chyba musze poszukac inny sposob na to zadanie
4 lis 12:15
hiko: bo chyba za bardzo juz się nie da przyspieszyc tego programu, wykorzystując tą metodę z modulo
?
4 lis 12:20
jc: Wiemy, że a i b > 0. Wpisz wszystko w funkcji main(), popraw w razie błędu.
a %= 10;
b = %4;
c = a;
if(b == 0) b = 4;
for(; b > 0; b−−) c *=a;
cout << c%10 << endl;
−−−−−
Drugie rozwiązanie: rozpatrywanie przypadków. Nie wiem, co będzie szybsze.
Próbuj.
0 −> 0
1 −> 1
2 −> 2, 4, 8, 6
3 −> 3, 9, 7, 3
4 −> 4, 6
5 −> 5
6 −> 6
7 −> 7, 9, 3, 1
8 −> 8, 4, 2, 6
9 −> 9, 1
4 lis 12:43
jc: A może tak?
int mian(){
int cyfra []
={0,0,0,0, 1,1,1,1, 6,2,4,8, 1,3,9,7, 6,4,6,4, 5,5,5,5, 6,6,6,6, 1,7,9,3, 6,8,4,2, 1,9,1,9};
int D, a, b;
cin >> D;
for(int i =0; i < D; i++){
cin >> a >> b;
cout << cyfra[4*(a%10) + b%4] << cout;
}
}
−−−
Możesz jeszcze to zmieniać: 4*(a%10) + b%4.
4 lis 12:59
jc: Po usunięciu błędów.
−−−
#include <iostream>
using namespace std;
int main(){
int cyfra []={0,0,0,0, 1,1,1,1, 6,2,4,8, 1,3,9,7, 6,4,6,4, 5,5,5,5, 6,6,6,6, 1,7,9,3,
6,8,4,2, 1,9,1,9};
int D, a, b;
cin >> D;
for(int n =0; n < D; n++){
cin >> a >> b;
cout << cyfra[4*(a%10) + b%4] << endl;
}
return 0;
}
4 lis 13:40
hiko: ok dzieki
4 lis 14:38
Dziadek Mróz:
potega(int a. int b):
ost = a
for i = 1; i <= b; i++:
ost = (ost*b) % 10
return ost
potega(2, 2):
ost = 2
ost = (2*2) % 10 = 4 % 10 = 4
ost = (4*2) % 10 = 8 % 10 = 8
return 8
potega(3, 3):
ost = 3
ost = (3*3) % 10 = 9 % 10 = 9
ost = (9*3) % 10 = 27 % 10 = 7
return 7
potega(3, 5):
ost = 3
ost = (3*3) % 10 = 9 % 10 = 9
ost = (9*3) % 10 = 27 % 10 = 7
ost = (7*3) % 10 = 21 % 10 = 1
ost = (1*3) % 10 = 3 % 10 = 3
return 3
4 lis 16:21