输入三个数,求a的b次方,对c取模
快速幂取模的思路:
a对b取模就是得到a除以b的余数,本题,取模就是取余
引理:积的取余等于取余的积的取余。
打个比方5的4次方对3取余,先按正常思维计算5的4次方625,对3取模,625除3得208余1,什么是取余的积再取余呢,先用5对3取余,得2,2的4次方为16,16再对3取余,得5余1,前后两次取余的结果都是1,以此证明公式
作者做这道题总共犯了三个错误,第一个就是没有考虑到类型溢出,先用FOR循环算出a的b次方的值,再对c取余,当a和b的数过大时,数据类型就存不下了,如果使用引理,只不过减少了底数的大小,当b(指数)过大时依然会爆掉。
为了解决指数太大的问题,又用到了另一个数学知识,
2的n次方等于2的2分之n次方乘以2的2分之n次方
打个比方就是2的8次方等于2的4次方乘以2的4次方,算不明白就把式子展开,自己比较一下几个2相乘就行了
根据刚才的例子得出一种解题思路
int a , b ,c
final d = a;
if(b%2==0){
for( ; b > 0 ; b/=2 ){
a =a*a
}}
else{
for( ; b > 1 ; b/=2 ){
a = a*a;
}
a=a*d;
}
看不明白就自己设想几个数,走一走,数学原理都在上面了
为什么要判断b(指数)的奇偶性呢,,举个例子2的9次方,是不是等于2的