給定整數 n(n ≤ 109),求 nn 的個位數字。多組測試,直到 EOF。
個位數字只取決於 n 的個位數 d = n mod 10,且 dk 的個位隨 k 循環。
只需預計算各數字的循環節:
| d | 循環節 | 長度 |
|---|---|---|
| 0 | 0 | 1 |
| 1 | 1 | 1 |
| 2 | 2,4,8,6 | 4 |
| 3 | 3,9,7,1 | 4 |
| 4 | 4,6 | 2 |
| 5 | 5 | 1 |
| 6 | 6 | 1 |
| 7 | 7,9,3,1 | 4 |
| 8 | 8,4,2,6 | 4 |
| 9 | 9,1 | 2 |
指數 n 對循環長取模即可定位答案。
直接硬編碼分支,避免循環數組開銷:
int lastDigit(int n) {
int d = n % 10;
switch (d) {
case 0: return 0;
case 1: return 1;
case 2: return (n % 4 == 0) ? 6 : (n % 4 == 1 ? 2 : (n % 4 == 2 ? 4 : 8));
case 3: return (n % 4 == 0) ? 1 : (n % 4 == 1 ? 3 : (n % 4 == 2 ? 9 : 7));
case 4: return (n % 2 == 0) ? 6 : 4;
case 5: return 5;
case 6: return 6;
case 7: return (n % 4 == 0) ? 1 : (n % 4 == 1 ? 7 : (n % 4 == 2 ? 9 : 3));
case 8: return (n % 4 == 0) ? 6 : (n % 4 == 1 ? 8 : (n % 4 == 2 ? 4 : 2));
case 9: return (n % 2 == 0) ? 1 : 9;
}
return 0;
}
#include <cstdio>
int main() {
int T, n; scanf("%d", &T);
while (T--) {
scanf("%d", &n);
printf("%d\n", lastDigit(n));
}
return 0;
}
每測試 O(1),極快。