HDU 1061 Rightmost Digit (数学&三种解法)
2013-08-27 16:20
555 查看
Rightmost Digit
http://acm.hdu.edu.cn/showproblem.php?pid=1061Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/32768 K (Java/Others)
Problem Description
Given a positive integer N, you should output the most right digit of N^N.
Input
The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.
Each test case contains a single positive integer N(1<=N<=1,000,000,000).
Output
For each test case, you should output the rightmost digit of N^N.
Sample Input
2 3 4
Sample Output
7 6 Hint In the first case, 3 * 3 * 3 = 27, so the rightmost digit is 7. In the second case, 4 * 4 * 4 * 4 = 256, so the rightmost digit is 6.
找规律吧:
基本代码:
/*0ms,228KB*/ #include<cstdio> int y; int ans(int temp) { switch (temp) { case 0: return 0; case 1: return 1; case 2: y %= 4; if (y == 0) y = 4; switch (y) { case 1: return 2; case 2: return 4; case 3: return 8; case 4: return 6; } case 3: y %= 4; if (y == 0) y = 4; switch (y) { case 1: return 3; case 2: return 9; case 3: return 7; case 4: return 1; } case 4: y %= 2; if (y == 0) y = 2; switch (y) { case 1: return 4; case 2: return 6; } case 5: return 5; case 6: return 6; case 7: y %= 4; if (y == 0) y = 4; switch (y) { case 1: return 7; case 2: return 9; case 3: return 3; case 4: return 1; } case 8: y %= 4; if (y == 0) y = 4; switch (y) { case 1: return 8; case 2: return 4; case 3: return 2; case 4: return 6; } case 9: y %= 2; if (y == 0) y = 2; switch (y) { case 1: return 9; case 2: return 1; } } } int main(void) { int t; scanf("%d", &t); while (t--) { scanf("%d", &y); int temp = y % 10; printf("%d\n", ans(temp)); } return 0; }
更好的规律:
/*0ms,228KB*/ #include<cstdio> const int ans[20] = { 0, 1, 4, 7, 6, 5, 6, 3, 6, 9, 0, 1, 6, 3, 6, 5, 6, 7, 4, 9 }; int main(void) { int T, N; scanf("%d", &T); while (T--) { scanf("%d", &N); printf("%d\n", ans[N % 20]); } }
规律的综合公式:
/*0ms,228KB*/ #include <cstdio> int main(void) { int t, n, p, sum; scanf("%d", &t); while (t--) { scanf("%d", &n); p = n % 10; sum = p; for (int i = 0; i < (n + 3) % 4; i++) sum *= p; printf("%d\n", sum % 10); } return 0; }
相关文章推荐
- hdu1061-Rightmost Digit(附20循环的规律解法和附快速幂简单原理)
- hdoj Rightmost Digit 1061 (数学转换&&找循环节)
- HDU - 1061 Rightmost Digit (数学打表)规律
- HDU - 1061 Rightmost Digit(数学)
- HDU 1061 Rightmost Digit(A^A mod 10)
- HDU 1061 Rightmost Digit (四则运算求余,快速幂)
- HDU 1061 Rightmost Digit
- hdu 1061 Rightmost Digit
- hdu 1061 Rightmost Digit
- HDU1061_Rightmost Digit【高速幂取余】
- 【HDU 杭电 1061】 Rightmost Digit
- hdu 1061 Rightmost Digit
- hdu---1061 Rightmost Digit
- HDU 1061 Rightmost Digit
- HDU1061 Rightmost Digit
- hdu 1061 Rightmost Digit
- HDU1061 Rightmost Digit【快速模幂】
- hdu 1061 Rightmost Digit
- hdu 1061 Rightmost Digit
- HDU-#1061 Rightmost Digit(规律、分治、快速幂取模)