看题请戳这儿
解题思路:通读全文即得,让求t的t次方,在求出个位上的数字。
首先~一开始的思路是对该数t取个位数在求t次方,在求个位数。结果数字爆炸了,超过了int整型数的范围。因此pass掉!
其次~找规律,然后发现个位数为0,1,5,6的时候,结果都与个位数一样。其他情况则存在循环:2【2,4,8,6,】;3【3,9,7,1】;4【4,6,46】;7【7.9.3.1】;8【8,4,2,6】;9【9,1,9,1】。 代码如下:
#include<stdio.h> int main() { int a,b,c; int l[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}; while(scanf("%d",&a) != EOF) { b = a % 10; c = a % 4; printf("%d\n",l[b*4+c]); } return 0; }
最后~快速幂的方法也可以解决这个问题。毛女神的代码如下:
def powmod(a,b): a %= 10 res = 1 while(b): if b & 1: res = res * a % 10 b >>= 1 a = a * a %20 return res try: while True: n = int(input()) print(powmod(n,n)) except: pass
PS:介绍一下快速幂, 当我们求a^ b时,其实b是可以拆成二进制的,该二进制数第i位的权为2^ (i-1),例如当b==11时,a^ 11=a^ (2^ 0+1^ 2+2^ 3)。 11的二进制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我们将a¹¹转化为算 a^ (2^ 0)*a^ (2^ 1)*a^ (2.^3) 。由于是二进制,就想到“位运算”: & 和 >> ,&运算通常用于二进制取位操作,&1就是取最后一位。>>运算比较单纯,二进制去掉最后一位,即除一个2。代码如下:
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; }