1. 程式人生 > ># 俱樂部每日一練 T^T(1)(快速冪)

# 俱樂部每日一練 T^T(1)(快速冪)

俱樂部每日一練 T^T(1)(快速冪)

Description

T ^ T這個很像一個流淚的表情是不是!其實,它是T的T次方啦~。當T比較大的時候T^T會非常大,現在只要你求這個數的個位就可以啦!

Input

輸入包括多組測試資料,每個測試資料只有一個數字T(0<T<2^{31})T(0<T<2
31
)。

Output

請輸出T^T的個位數。

Sample Input 1

1
2
3
105
Sample Output 1

1
4
7
5


  1. T^T的個位數即是T的個位數的T次方。將每個T的個位數的T次方的個位數列出來,觀察可知個位數的變換是有規律的。
    0 : 0
    1 : 1
    2 : 2 4 8 6
    3 : 3 9 7 1
    4 : 4 6
    5 : 5
    6 : 6
    7 : 7 9 3 1
    8 : 8 4 2 6
    9 : 9 1
    不同數的個位是在這幾個數之間不斷迴圈的,程式碼:
l=[[0],[1],[2,4,8,6],[3,9,7,1],[4,6],[5],[6],[7,9,3,1],[8,4,2,6],[9,1]]
while 1:
    T=int(input())
    a=T%10
    if a==0:
        print(0)
    else:
        b=T%len(l[a])
        print(l[a][b-1])
  1. 用快速冪進行簡化運算
    快速冪的目的是進行快速求冪,假設求2^ 11 (a^b),將11拆為二進位制為1101,原式變為2 ^(2 ^0+2 ^2+2 ^3)
    再通過&位與運算(與一個數的二進位制進行對位與運算)和>>(二進位制去掉最後一位)進行運算,程式碼:
int poww(int a,int b){
    int ans=1,base=a;
    while(b!=0){
        if(b&1!=0)
          ans*=base;
        base*=base;
        b>>=1;
  }
    return ans;
}

如果b的二進位制末尾為1,結果ans乘以這個位的底數值,一定要將底數值進行進位並去掉b二進位制的最後一位,之後進入下一位的判斷。
附上大佬對快速冪解釋的網址:快速冪
對於這道題,因為輸入的T可能原本就很大,所以對T及之後所得數對10進行取餘。
程式碼:

#include <stdio.h>
int main()
{
    int res,base1,base2;
    while(scanf("%d",&base1)!=EOF){
            res=1;
            base2=base1%10;
            while(base1>0){
                if (base1&1!=0)
                    res=(res*base2)%10;
                base2=(base2*base2)%10;
                base1>>=1;
            }
    printf("%d\n",res);
    }
    return 0;
}