matematykaszkolna.pl
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 emotka 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