杭电1061 快速幂做法
源题网址:http://acm.hdu.edu.cn/showproblem.php?pid=1061
Problem Description
Given a positive integer N, you should output the most right digit of N^N.
Input
The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.
Output
Each test case contains a single positive integer N(1<=N<=1,000,000,000).
Output
For each test case, you should output the rightmost digit of N^N.
Sample Input
2
3
4
Sample Output
7
6
首先来说一下快速幂的原理
假如你要求a的b次方
比如
这个是先将11转化为2进制,进而求解
因为11的二进制是1011
所以
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
所以原来复杂循环次数多的计算,就因此而简便了许多
并且c++里有求二进制的运算符 不用担心二进制求法的问题
AC代码
#include<iostream>
using namespace std;
typedef long long ll;
ll ksm(ll a,ll b)
{
ll base=a,r=1;
while(b!=0)
{
if(b&1)// 这里是取b的二进制最低位 在刚才的说明中 若二进制中有0这个数 那么 是没有计算进去的
{
r=base*r%10;//余10 以防数值越界
}
base=base*base%10; //同上 无论上面b的最后一位是否是0 这里都要将 base乘下去 因为二进制位数 在增加 base也要相应增加
b>>=1;//位运算去掉最后一位二进制
}
return r%10;
}
int main()
{
ll n,t;
cin>>t;
while(t--)
{
cin>>n;
cout<<ksm(n,n)<<endl;
}
return 0;
}