求T^T的个位数
Description
这个很像一个流泪的表情是不是!其实,它是T的T次方啦~。当T比较大的时候T^T会非常大,现在只要你求这个数的个位就可以啦!
Input
输入包括多组测试数据,每个测试数据只有一个数字T(0<T<231)T(0<T<2 31)
Output
请输出T^T的个位数。
Sample Input 1
1
2
3
105
Sample Output 1
1
4
7
5
这只是我个人的理解
首先,这个题肯定不能暴力啊
最开始的思路来源:
说a的b次方的个位数 算法吧(a=b时就是这道题的T^T)
看完这段思路,就知道为啥b要%4了。。。
首先:a**b的个位数 : 等于 a的个位数 的b次方 即等于(a%10)^b的个位数
现在的问题就是观察0到9的b次方的个位数规律了(a%10范围0到9)
找找规律:
0,1,5,6的b次方结果的个位还是0,1,5,6
2的b次方结果的个位 以 2,4,8,6 循环 (b每增加4循环一次)
3的b次方结果的个位 以3,9,7,1循环 (b每增加4循环一次)
4:以4,6循环 (b每增加2循环一次)
7: 7,9,3,1循环 (b每增加4循环一次)
8: 8,4,2,6循环 (b每增加4循环一次)
9: 9,1循环 (b每增加2循环一次)
所以,所有数字把b每增加4次看成一个回合,写代码的时候先写上b=a%4
注意一下b==0的时候
下面这个是我最初的思路,完全没有整理整理就提交了。。bug满满的。。原谅我开始头脑简单四肢发达了
try:
while 1:
n=int(input())
b=n%4
while n>10:#其实这一行一点必要都没有。。当时的我竟然没有理解%10是啥东东来着!!!我的妈呀。。没救了
n=n%10
if n==0 or n==1 or n==5 or n==6 or n==9: #n==9是后来写的。开始没有注意到。。
print(n)
elif n==2:
L=[6,2,4,8]
print(L[b])
elif n==3:
M=[1,3,9,7]
print(M[b])
elif n==4:
N=[6,4,6,4]
print(N[b])
elif n==7:
K=[1,7,9,3]
print(K[b])
elif n==8:
O=[6,8,4,2]
print(O[b])
#elif n==9: 后来仔细想了一下,n==9的时候,奇数对4取余,肯定是奇数,也就是只能取到P[1],P[3],
#P=[1,9,1,9] 然而P[1],P[3]开始恰好写的9,就这样AC了~~其实是不对的
#print(P[b]) 9的奇数次方个位数一定是9,9的偶数次方个位数一定是1,但这道题9的9次方,只有9这种情况。。
except EOFError:
pass
取一个数的个位数就是n%10啊!!我当时想啥呢555~
当然了以后不能总是依赖python。所以我就按照这个思路转了个c。。
#include<stdio.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int b;
b=n%4;
n=n%10;
int I[40]={0,0,0,0,1,1,1,1,6,2,4,8,1,3,9,7,6,4,6,4,5,5,5,5,6,6,6,6,1,7,9,3,6,8,4,2,1,9,1,9};
printf("%d\n",I[n*4+b]);
}return 0;
}
后来我看了看大佬们的代码:代码实在是优秀啊!
然后我根据这个思路整理了一下:
后来提交的AC的代码
try:
while 1:
a=int(input())
b=a%4
if b==0:
b=4
print(((a%10)**b)%10)
except EOFError:
pass
思路就是这样的,用c的话,直接转过去就行了。。
当然这道题也可以用快速幂的啦
毛学姐的快速幂代码:
def mi(a,b):
a %= 10
res = 1
while b!=0:
if b & 1: # 意思就是:取2进制的最末位
res=res * a % 10
b >>= 1 #意思就是: b=b//2
a = a * a % 10
return res
try:
while 1:
n=int(input())
print(mi(n,n))
except EOFError:
pass
个人总结。刚开始写博客啥的没啥经验,有建议的大佬们私聊啊