Rightmost Digit(快速幂)
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.
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
Hint
In the first case, 3 * 3 * 3 = 27, so the rightmost digit is 7.
In the second case, 4 * 4 * 4 * 4 = 256, so the rightmost digit is 6.
题解:求N^N的最后一位,我们可以先把N%10后再求N的N次幂,每次都%10就能得到最后的一位数,但这种方法虽然能得到答案但时间复杂度为O(n),所以在这里可以用快速幂算法,把时间复杂度降为O(logn);
下面是快速幂的模板:
longlong fast_pow(long long a, long long b,long long mod) {
int ans = 1;
while (b != 0)
{
if (b & 1 != 0)
ans *= a;
a*= a;
b>>= 1;
}
return ans;
}
AC代码:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <iostream>
using namespace std;
int fast_pow(int base,int power) //快速幂函数;
{
int ans=1; //用来保存答案;
base=base%10;
while(power) //指数为0时结束运算;
{
if(power&1) //对指数进行位运算;
ans=ans*base%10; //%10防止数据超过int;
base=base*base%10; //为下次运算做准备;
power>>=1; //指数二进制位向右移一位;
}
return (ans);
}
int main()
{
int T;
cin>>T;
while(T--)
{
int N;
cin>>N;
printf("%d\n",fast_pow(N,N));
}
return 0;
}