应用场景:求a的n次幂
核心代码:
非递归
long long fast_pow(int a,int n) {
long long ans=1;//当n为0是为1
while (n) {
if (n & 1) ans *= a;//若n为奇数
n >>= 1;//n整除2
a *= a;
}
return ans;
}
思路:
n看作二进制
每次将n右移一位 依次取其二进制位数字
若此时为1 则ans*a
每次取一位 a要进行a*a计算 保证当前a的次数 与二进制1所表示的数字相同
即 从低到高取n的二进制位,每取一位 a*a 使得a的次数与当前二进制位相符 如101 取第一位1时,a=a,ans*=a;取第二位0时,a=a^2;取第三位1时,a=a^4 ,ans=ans*a^4;如此进行,直到n=0
递归版
long long fast(int a,long long n) {
long long x;
if (n == 0)
return 1;
if (n == 1)
return a;
if (n == 2)
return a*a;
if (n % 2 == 0) {
x = fast(a, n/2)%100;
return (x * x) % 100;
}
if (n % 2 == 1) {
x = fast(a, (n - 1) / 2)%100;
return (a * x * x)%100;
}
}
思路:
如果n是偶数,ans = a^(n/2)* a^(n/2) 如果n是奇数 ans = a*a^(n/2)* a^(n/2)