zadanie SPOJ "Czy umiesz potęgować"

0

Cześć! Czy ktoś może powiedzieć w czym jest błąd. SPOJ wyrzuca mi, że rozwiązanie jest błędne. W IntelliJ działa.
https://pl.spoj.com/problems/PA05_POT/

import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws java.lang.Exception {
        Scanner sc = new Scanner(System.in);
        //System.out.print("Wprowadź liczbę linii danych: ");
        int numberOfInput = Integer.parseInt(sc.nextLine());
        String[] inputs = new String[numberOfInput];

        for (int i = 0; i < numberOfInput; i++) {
            //System.out.print("Wprowadź daną nr " + (int) (i + 1) + ": ");
            inputs[i] = sc.nextLine();
        }

        for (int i = 0; i < numberOfInput; i++) {
            StringTokenizer st = new StringTokenizer(inputs[i]);
            String nString = st.nextToken();
            String pString = st.nextToken();

            int n = Integer.parseInt(nString.substring(nString.length()-1));
            int p = Integer.parseInt(pString.substring(pString.length()-1));
            int out = 0;
            boolean isPEven;

            if (n == 0 || n == 1 || n == 5 || n == 6) {
                out = n;
            } else {
                if (p%2 != 0) {
                    isPEven = false;
                } else {
                    isPEven = true;
                }
                if (n == 4) {
                    if (!isPEven) {
                        out = 4;
                    } else {
                        out = 6;
                    }
                } else if (n == 9) {
                    if (!isPEven) {
                        out = 9;
                    } else {
                        out = 1;
                    }
                } else {
                    int rest = p%4;
                    switch(n) {
                        case 2:
                            int[] table2 = {6, 2, 4, 8};
                            out = table2[rest];
                            break;
                        case 3:
                            int[] table3 = {1, 3, 9, 7};
                            out = table3[rest];
                            break;
                        case 7:
                            int[] table7 = {1, 7, 9, 3};
                            out = table7[rest];
                            break;
                        case 8:
                            int[] table8 = {6, 8, 4, 2};
                            out = table8[rest];
                            break;
                    }
                }
            }
            System.out.println(out);
        }
    }
}
1

Wywołuj funkcję, będzie łatwiej debugować:

static int lastDigit(int n, int p) {
    n %= 10;
    if (n == 0 || n == 1 || n == 5 || n == 6)
      return n;
    if (n == 4) {
      if (p % 2 == 0){
        return 6;
      }
      else {
        return 4;
      }
    }
    if (n == 9) {
      if (p % 2 == 0) {
        return 1;
      }
      else {
        return 9;
      }
    }
    if (n == 2 || n == 3 || n == 7 || n == 8){
      int r = p % 4;
      if (r == 1 && n == 2)
        return 2;
      if (r == 1 && n == 3)
        return 3;
      if (r == 1 && n == 7)
        return 7;
      if (r == 1 && n == 8)
        return 8;
      if (r == 2 && n == 2)
        return 4;
      if (r == 2 && n == 3)
        return 9;
      if (r == 2 && n == 7)
        return 9;
      if (r == 2 && n == 7)
        return 4;
      if (r == 3 && n == 2)
        return 8;
      if (r == 3 && n == 3)
        return 7;
      if (r == 3 && n == 7)
        return 3;
      if (r == 3 && n == 8)
        return 2;
      if (r == 0 && n == 2)
        return 6;
      if (r == 0 && n == 3)
        return 1;
      if (r == 0 && n == 7)
        return 1;
      if (r == 0 && n == 8)
        return 6;
    }
  }
0

Cześć! Dziękuję za odpowiedź. Niestety nadal nie mogę rozwiązać problemu. Zapisałem swoje jak i Twoje rozwiązanie jako funkcje i wyniki są takie same. Kod wrzucam poniżej. A wcześniej zamieściłem kod prosto ze SPOJA, dlatego, dlatego że przypuszczam, że problem tkwi w czymś innym niż samo działanie algorytmu obliczającego. Tak więc wracam o pierwotnego pytania, co zrobić z pierwotnym kodem, aby SPOJ go puścił.

package Latwe;

import java.util.Scanner;
import java.util.StringTokenizer;

public class CzyUmieszPotegowacFunction {

    static int lastDigit(int n, int p) {
        int out = 0;
        boolean isPEven;

        if (n == 0 || n == 1 || n == 5 || n == 6) {
            out = n;
        } else {
            if (p%2 != 0) {
                isPEven = false;
            } else {
                isPEven = true;
            }
            if (n == 4) {
                if (!isPEven) {
                    out = 4;
                } else {
                    out = 6;
                }
            } else if (n == 9) {
                if (!isPEven) {
                    out = 9;
                } else {
                    out = 1;
                }
            } else {
                int rest = p%4;
                switch(n) {
                    case 2:
                        int[] table2 = {6, 2, 4, 8};
                        out = table2[rest];
                        break;
                    case 3:
                        int[] table3 = {1, 3, 9, 7};
                        out = table3[rest];
                        break;
                    case 7:
                        int[] table7 = {1, 7, 9, 3};
                        out = table7[rest];
                        break;
                    case 8:
                        int[] table8 = {6, 8, 4, 2};
                        out = table8[rest];
                        break;
                }
            }
        }
        return out;
    }

    public static void main(String[] args) throws Exception {

        Scanner sc = new Scanner(System.in);
        System.out.print("Wprowadź liczbę linii danych: ");
        int numberOfInput = Integer.parseInt(sc.nextLine());
        String[] inputs = new String[numberOfInput];

        for (int i = 0; i < numberOfInput; i++) {
            System.out.print("Wprowadź daną nr " + (int) (i + 1) + ": ");
            inputs[i] = sc.nextLine();
        }

        for (int i = 0; i < numberOfInput; i++) {
            StringTokenizer st = new StringTokenizer(inputs[i]);
            String nString = st.nextToken();
            String pString = st.nextToken();

            int n = Integer.parseInt(nString.substring(nString.length()-1));
            int p = Integer.parseInt(pString.substring(pString.length()-1));

            System.out.println(lastDigit(n,p));
        }
    }
}

i Twój kod:

package Latwe;

import java.util.Scanner;
import java.util.StringTokenizer;

public class lion137 {

    static int lastDigit(int n, int p) {
        n %= 10;
        int out = 0;
        if (n == 0 || n == 1 || n == 5 || n == 6)
            out = n;
        if (n == 4) {
            if (p % 2 == 0){
                out = 6;
            }
            else {
                out = 4;
            }
        }
        if (n == 9) {
            if (p % 2 == 0) {
                out = 1;
            }
            else {
                out = 9;
            }
        }
        if (n == 2 || n == 3 || n == 7 || n == 8){
            int r = p % 4;
            if (r == 1 && n == 2)
                out = 2;
            if (r == 1 && n == 3)
                out = 3;
            if (r == 1 && n == 7)
                out = 7;
            if (r == 1 && n == 8)
                out = 8;
            if (r == 2 && n == 2)
                out = 4;
            if (r == 2 && n == 3)
                out = 9;
            if (r == 2 && n == 7)
                out = 9;
            if (r == 2 && n == 7)
                out = 4;
            if (r == 3 && n == 2)
                out = 8;
            if (r == 3 && n == 3)
                out = 7;
            if (r == 3 && n == 7)
                out = 3;
            if (r == 3 && n == 8)
                out =2;
            if (r == 0 && n == 2)
                out = 6;
            if (r == 0 && n == 3)
                out = 1;
            if (r == 0 && n == 7)
                out = 1;
            if (r == 0 && n == 8)
                out = 6;
        }
        return out;
    }

    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        System.out.print("Wprowadź liczbę linii danych: ");
        int numberOfInput = Integer.parseInt(sc.nextLine());
        String[] inputs = new String[numberOfInput];

        for (int i = 0; i < numberOfInput; i++) {
            System.out.print("Wprowadź daną nr " + (int) (i + 1) + ": ");
            inputs[i] = sc.nextLine();
        }

        for (int i = 0; i < numberOfInput; i++) {
            StringTokenizer st = new StringTokenizer(inputs[i]);
            String nString = st.nextToken();
            String pString = st.nextToken();

            int n = Integer.parseInt(nString.substring(nString.length()-1));
            int p = Integer.parseInt(pString.substring(pString.length()-1));

            System.out.println(lastDigit(n,p));
        }
    }
}

0

Próbowałem to wrzucić na SPOJA i daje błędny wynik, coś w tych ifach jest pochrzanione, a nie wiem co, bo to gdzieś znalezione. Ale, z tego co pamiętam, to zadanie przechodzi też z potęgowaniem modulo, chociaż złożoność jest logarytmiczna a nie stała, jak z tymi ifami.

0

Zrobiłem test dla kilkunastu wartości obejmujących wszystkie przypadki i oba algorytmy działają. Myślałem, że coś pochrzaniłem przy odczytywaniu danych, bo to pierwsze moje zadanie z dwoma danymi podanymi w linii. Dzięki za poświęcony czas.

0

Niestety nie. Ale zostawię to na razie, bo nie mam pomysłu w czym jest błąd.

0

Ok, dam znać czy poszło.

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