首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

HDU 1061 Rightmost Digit:求 nn 末位數字

     編輯:關於C++

題目大意

給定整數 n(n ≤ 109),求 nn 的個位數字。多組測試,直到 EOF。

數學規律

個位數字只取決於 n 的個位數 d = n mod 10,且 dk 的個位隨 k 循環。
只需預計算各數字的循環節:

d循環節長度
001
111
22,4,8,64
33,9,7,14
44,62
551
661
77,9,3,14
88,4,2,64
99,12

指數 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),極快。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved