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

本题描述(源自杭电OJ):
在这里插入图片描述
本题分析:火眼金睛,“打表找规律”速解此题
我们都知道,此题本质上就是相同个位数字的不断相乘。而相同个数数字不断相乘的结果,其个位数字呈周期性变化。
以数字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<bits/stdc++.h> //(源自杭电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;
}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值