# 俱樂部每日一練 T^T(1)(快速冪)
阿新 • • 發佈:2018-12-12
俱樂部每日一練 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
- 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])
- 用快速冪進行簡化運算
快速冪的目的是進行快速求冪,假設求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;
}