快速幂算法(hdu) Rightmost Digit

本文介绍了快速幂算法,主要用于高效地计算一个数的幂。通过举例和代码展示,阐述了算法原理,包括如何处理奇偶次幂的情况,并提供了一个递归实现的示例。此外,还分享了一个小技巧,即在幂运算取模过程中,余数会进入循环状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速幂算法,顾名思义,就是进行幂运算,http://acm.hdu.edu.cn/showproblem.php?pid=1061
这是hdu经典的一道题,如果我在接下来的解析中写的不好,也请大家指点。
hdu这道题,他要求我们算出每个正整数的个位数,
这里写图片描述
这里我先上代码,按题要求,我们先输入t,即接下去我们要进行测试t个例子,t– 的同时我们输入我们要取个位的数字,然后打印go,重点来咯,go自定义函数,就是进行取模运算的关键,因为无论输入什么数字,我们取模后他的个位都不会发生变化,因此,我们在开头就定义了一个a,先将他取模,这样,更是减少了算法的复杂度,b就是a的b次,while(b)相当于当b!=0的时候,也就是当b次不为0时,我们就可以进行幂运算啦,这里写图片描述
从这个图片就能看出,当为奇数的时候,他会剩下最后一个单独的A,因此ans=(ans*a)%10就由此得出,这句话就是进行奇数运算的时候所要进行的,最后(a*a)%c ,a*a就是要求进行的b次运算,最后取模,得到个位数,进行到n-2次的时候 b因为b/2变为1,得出b次的最后一个个位数,这是回到if (b % 2 == 1) ans = (ans*a) % c;  得出最后一个个位数,返回到主函数main中,就可以得出答案拉。
另外,在这里指出一个小技巧,当我们进行b次相乘取模的时候,我们会有趣的发现,在我们算出几个余数之后,接下去的余数会无限有循环的计算下去。例如2%10=2,(2*2)%10=4,(2*2*2)%10=8,(2*2*2*2)%10=16,(2*2*2*2*2)%10=2
,(2*2*2*2*2*2)%10=4.。。。。。。。
另外还有递归进行的幂算法,
int qpow(int a,int n)  
{  
    if(n == 0) return 1;  
    int half = qpow(a,n/2);  
    if(n%2)  
        return half*half*a;  
    return half*half;  
}  
  
int main()  
{  
    printf(“%d\n”, qpow(2,10));  
    return 0;  
}  。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值