PA05_POT - Czy umiesz potęgować spoj

0

Mam problem z zadaniem http://pl.spoj.com/problems/PA05_POT/
Napisałem taki kod ale najwyraźniej coś nie gra tak jak powinno. Orientuje się ktoś co robię nie tak/ czego baruje?

import java.util.Scanner;

public class SUMA {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int ile = scanner.nextInt();
        int[] tab = new int[ile * 2];
        int reszta;
        int wynik;
        for (int i = 0; i <= ile * 2-1; i = i + 2) {//parzyste podstawa, nieparzyste wykładnik
            tab[i] = scanner.nextInt();
            tab[i + 1] = scanner.nextInt();

        }

        for (int i = 0; i <= ile * 2 - 2; i = i + 2) {
            wynik = 1;
            reszta = tab[i + 1] % 4;

            if (reszta > 0) {
                for (int j = 1; j <= reszta; j++) {
                    wynik = wynik * tab[i];

                }
                System.out.println(wynik % 10);

            }

            else {
                wynik = tab[i] * tab[i] * tab[i] * tab[i];
                System.out.println(wynik % 10);
            }
        }

    }

}
0
  1. reszta = tab[i + 1] % 4; - jaka reszta? jakie modulo 4?
  2. wynik = tab[i] * tab[i] * tab[i] * tab[i]; co to ma robić?
  3. nie potrzebujesz mnożyć całych liczb, aby wiedzieć, jaka będzie ostatnia cyfra działania a^b - o to chodzi w tym zadaniu.
0

@Patryk27
1)
cyfry jedności powtarzają się wraz ze wzrostem o 4 potęgi stąd reszta = tab[i + 1] % 4;
a tab[i + 1] jest u mnie zawsze wykładnikiem

jeśli reszta =1 to cyfra jedności będzie taka jak cyfra jedności wyrażenia a^1
jeśli reszta =2 to cyfra jedności będzie taka jak cyfra jedności wyrażenia a^2
jeśli reszta =4 to cyfra jedności będzie taka jak cyfra jedności wyrażenia a^3
jeśli reszta =0 to cyfra jedności będzie taka jak cyfra jedności wyrażenia a^4

2)
trochę pojechałem powinno być wynik= (int)Math.pow(tab[i],4);
3) oczywiście że nie będę mnożył 5351^45435 i nigdzie tego w programie nie robię. Mnożę co najwyżej do 4 potęgi. bo mając liczbę jedności z 1,2,3 i 4 potęgi mam liczbę jedności z n1 / n2 / n3 /n4 potęgi tak jak pisałem w pkt 1.

jeszcze nadmienię że testowałem program dla wielu potęg i wyglądało mi na to że program działa poprawnie

0

U Ciebie w programie 5 do 0 = 5. Zrób sobie solidny zestaw testów na start.

0

@kapojot
działamy na (1 ≤ a,b ≤ 1 000 000 000). więc 5^0 mnie nie interesuje

0

Co nie zmienia faktu, że na dzień dobry masz buga. Dalej nawet nie szukałem.

0

@kapojot

Specjalnie dla Ciebie dopisałem obsługę potęgi zerowej. W ten sposób wykonałem coś o co nie byłem proszony a otrzymałem wydłużony czas działanie programu. ( ͡° ͜ʖ ͡°)

import java.util.Scanner;

public class SUMA {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int ile = scanner.nextInt();
        int[] tab = new int[ile * 2];
        int reszta;
        int wynik;
        for (int i = 0; i <= ile * 2-1; i = i + 2) {//parzyste podstawa, nieparzyste wykładnik
            tab[i] = scanner.nextInt();
            tab[i + 1] = scanner.nextInt();

        }

        for (int i = 0; i <= ile * 2 - 2; i = i + 2) {

            if(tab[i + 1]==0)
                System.out.println("1");

            else{
            wynik = 1;
            reszta = tab[i + 1] % 4;

            if (reszta > 0) {
                for (int j = 1; j <= reszta; j++) {
                    wynik = wynik * tab[i];

                }
                System.out.println(wynik % 10);

            }

            else {
                wynik= (int)Math.pow(tab[i],4);

                System.out.println(wynik % 10);
            }
        }

    }
    }

}
0

(a mod 10)(4 + b mod 4) ma tę samą cyfrę jedności co ab, gdzie 1 <= a,b

0

Kłaniam się uprzejmie i dziękuję za wysiłek nie wiadomo po co.

A tutaj działający kod.

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a, b, ile, reszta, wynik;

        ile = scanner.nextInt();

        for (int i = 0; i < ile; i++) {
            a = scanner.nextInt();
            b = scanner.nextInt();

            wynik = a % 10;
            reszta = b % 4;

            if (reszta == 0)
                wynik = (a % 10) * (a % 10) * (a % 10) * (a % 10) % 10;
            for (int j = 1; j < reszta; j++)
                wynik = wynik * (a % 10);
            System.out.println(wynik % 10);
        }
    }
}

@VereX: Bzdura. Dla a = 10 i b = 4 masz nan po lewej stronie zgodnie z Twoim wzorem.

Edit:
@VereX: Po ostatniej edycji zwracam honory.

0

Rozwiązanie napisane na podstawie mojej wypowiedzi:

import java.util.Scanner;
class Main{
    public static void main (String[] args) throws java.lang.Exception {
    Scanner scanner = new Scanner(System.in);

        for (int t = scanner.nextInt(); t > 0; t--)
           System.out.println(((int)Math.pow(scanner.nextInt()%10, 4+scanner.nextInt()%4)%10));
 }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0