杭电1097题

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=1097

题目要求

求a^b的最后一位数是几

易知a^b的最后一位数即(a%10)^b的最后一位数,但是b的范围太大,观察规律可知,个位数的乘方去最后一位数是循环的,例如个位数为0和1,无论b为多少,其结果均为0和1

个位数字循环相乘取个位数循环间隔
001
111
22,4,8,64
33,9,7,14
44,62
551
661
77,9,3,14
88,4,2,64
99,12

易知只需计算(a%10)^(b%(a%10对应的循环间隔))即可。
如果a = 8, b = 4, 按照上述计算方法得出的结果为(8%10)^(4%4) = 8^0 = 1, 显然结果是错误的,如果b%(a%10对应的循环间隔)为0,此时要取b为a%10对应的循环间隔,而不再进行取余。
代码如下:

#include<stdio.h>
int main()
{
    int num[10] = { 1,1,4,4,2,1,1,4,4,2 };
    int n, m, temp;
    while (~scanf("%d%d", &n, &m))
    {
        n = n % 10;
        m = m%num[n];
        if (m == 0)
        {
            m = num[n];
        }
        temp = n;
        for (int i = 1; i < m; ++i)
        {
            temp = (temp*n) % 10;
        }
        printf("%d\n", temp);
    }
    return 0;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值