题目
Given a positive integer N, you should output the most right digit of N^N.
给定一个正整数 N,您应该输出 N^N 的最右边的数字。
给定一个正整数 N,您应该输出 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.
输入包含多个测试用例。输入的第一行是一个整数 T,它是测试用例的数量。接下来是 T 个测试用例。
Each test case contains a single positive integer N(1<=N<=1,000,000,000).
每个测试用例都包含一个正整数 N(1<=N<=1,000,000,000)。
输入包含多个测试用例。输入的第一行是一个整数 T,它是测试用例的数量。接下来是 T 个测试用例。
Each test case contains a single positive integer N(1<=N<=1,000,000,000).
每个测试用例都包含一个正整数 N(1<=N<=1,000,000,000)。
Output
For each test case, you should output the rightmost digit of N^N.
对于每个测试用例,应输出 N^N 的最右边数字。
对于每个测试用例,应输出 N^N 的最右边数字。
Sample
Inputcopy | Outputcopy |
---|---|
2
3
4
| 7
6 |
Hint
In the first case, 3 * 3 * 3 = 27, so the rightmost digit is 7.
在第一种情况下,3 * 3 * 3 = 27,所以最右边的数字是 7。
In the second case, 4 * 4 * 4 * 4 = 256, so the rightmost digit is 6.
在第二种情况下,4 * 4 * 4 * 4 = 256,所以最右边的数字是 6。
思路
如果采用一般的算法,直接进行计算,无疑由于数据范围的限制,会导致long long的内存溢出,因此我们需要通过快速幂算法以及其优化,从而进行对数值的计算和题目要求的实现。
代码实现
#include <bits/stdc++.h>
using namespace std;
int fapow(int n){//底数
int m=n;//指数
int result=1;//记录结果
while(m){
if(m&1)result=result*n%10;//如果是奇数,那么去掉一位,答案×一位
m>>=1;//折断
n=n*n%10;//再次取余,防止溢出
}//快速幂优化版
return result;//返回结果
}
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
cout<<fapow(n)<<endl;
}
}
总结
本题为我们介绍了快速幂,并且加强了快速幂算法,为我们后面的取余以及数据的溢出提供了新的思路和理解,希望通过本篇文章,各位读者能够有新的收获和认识,如果觉得笔者写的还不错的话,留下你的点赞收藏和关注哦