# 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);
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);
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);
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.