C/C++:计算N的N次方的个位数(火眼金睛找规律,解决此题数据问题)

本题描述(源自杭电OJ):
C/C++:计算N的N次方的个位数(火眼金睛找规律,解决此题数据问题)_第1张图片
本题分析:火眼金睛,“打表找规律”速解此题
我们都知道,此题本质上就是相同个位数字的不断相乘。而相同个数数字不断相乘的结果,其个位数字呈周期性变化。
以数字3为例,第一次33=9,第二次93=7,第三次73=1,第四次13=3,回到最开始的3,因此3的循环周期为4。同样的,0~9都有其循环周期,我们只需要找到这个循环周期,后面一切都好办。
具体怎么办呢?看此时指数,如果指数%周期=x,那么在这个循环周期内的第x个数就是结果个位数。
举个例子,1233的1233次,个位数字是3,周期刚才分析过了是4,1233%4=1,循环周期内的数分别是{3,9,7,1},第1个数字是3,因此1233的1233次的个位数就是3。
明白了这个原理,接下来我们具体讲一讲代码如何实现!

代码实现:

#include //(源自杭电LCY入门算法课程)
using namespace std;
void solve()
{
    int n;
    int a[10] = {1,1,4,4,2,1,1,4,4,2}; //对应数字0~9的循环周期长度 
    cin >> n;
    int ans = 1;
    int p = n % 10; //找到并存放N的个位数字于p 
    n = n % a[p]; //用n存放结果是循环周期中的第几个数 
    if (n == 0) //如果n=0,说明是循环周期中最后一个数,因此要加上循环周期长度 
        n += a[p];
    for (int i = 1; i <= n; i++) //具体第几个数,就乘几次初始个位数 
        ans = (ans * p) % 10;
    cout << ans << "\n";
}
int main()
{
    ios::sync_with_stdio(false); //取消同步流,提高cin效率 
    int t;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

你可能感兴趣的:(算法,c++)