题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1061
收获:1.利用二进制求指数幂(快速幂法)~~减少循环次数和提高速度(适用于乘数比较大的情况下)
2.(a*b)%n=(a%n*b%n)%n;
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int main()
{int t;
__int64 n;
scanf("%d",&t);
while(t--)
{scanf("%I64d",&n);
int k;
k=n%10;
int t=1;
while(n) //n为指数,n同时也为底数,k也相当于底数
{if(n&1){ //判断该位是否是1,如果为1,首次赋值给t,后来的与t相乘,求10的余数,再赋值给t
t*=k;
t%=10;
}
k*=k;
k%=10; //因为每当n向左移一位时,相当于2^n个k相乘(2^0表示1个,2^1表示2个2^0,2^2表示2个2^1……以此类推)
n>>=1; //n化为二进制数,不断左移~~
}
printf("%d\n",t);
}
return 0;
}
注意:k,t的范围,容易超出~~因为不断乘,很可能会变成大数~~
知识点扩展:http://blog.163.com/xiaoting_hu/blog/static/50464772201325095143/(转载)