HDOJ-ACM1061(JAVA) Rightmost Digit
题意:求n的n次方的个位数(1<=N<=1,000,000,000)
第一个最愚蠢的办法就是暴力破解,没什么意义,当然,还是实现来玩玩。
以下是JAVA暴力破解:
import java.io.BufferedInputStream; import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(new BufferedInputStream(System.in));
int m = scan.nextInt(); while(m--!=0){ int n = scan.nextInt(); double result = Math.pow(n, n); System.out.println(result%10); } scan.close(); } }
第二个思路是寻找规律:
规律:求取个位数,其实就等于 n的个位数的n次方,252^252 的个位数等于 2^252的个位数
另外: 无论n为多少,他的个位数是1-9,那么如 2 * 2 = 4 ; 2*4=8 ; 2*8 = 16 ; 2*16 = 32 ; 当 结果为 32 个位数为 2 , 那便开始了新一轮的 循环(2,4,8,6,2,4....)。
以下是JAVA实现:
import java.io.BufferedInputStream; import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(new BufferedInputStream(System.in)); int m = scan.nextInt(); while(m--!=0){ int n = scan.nextInt(); int rightMostDigitOfN = n%10; ArrayList<Integer> rightMostDigits = arrays.get(rightMostDigitOfN); int size = rightMostDigits.size(); if(size == 1){ System.out.println(rightMostDigitOfN); }else{ System.out.println(rightMostDigits.get((n-1)%size)); } } scan.close(); } static ArrayList<ArrayList<Integer>> arrays = getRightMostDigitArray(); static ArrayList<ArrayList<Integer>> getRightMostDigitArray(){ ArrayList<ArrayList<Integer>> arrays = new ArrayList<>(); for(int i = 0 ; i != 10 ; i ++){ ArrayList<Integer> integers = new ArrayList<>(); integers.add(i); int n = 2; while(true){ int rightMostDigit = (int) (Math.pow(i, n)%10); if(rightMostDigit==i){ break; }else{ integers.add(rightMostDigit); } n++; } arrays.add(integers); } return arrays; } }
让蔷薇开出一种结果~