快速幂基本原理: X^62 = (X^31) ^2
X^31 = (X^15) ^2 * X
X^15 = (X^7) ^2 * X
X^7 = (X^3) ^2 * X
X^3 = (X^1) ^2 * X
时间复杂度为 logN
实际中因为最后所求数太大,一般类型都储存不了,所以都会求 其mod一个数的值,具体代码大家自己改动
#include<stdio.h>
int IsEven(int n){
if( 0 == (n % 2)) return 1;
else return 0;
}
long long Pow1(long long X,int n) // 递归写法
{ // 写法比较简单 每次递归相乘
if( 0 == n) return 1;
if(1 == n) return X;
if(IsEven(n)) // 判断是否为偶数
return Pow1( X * X , n / 2);
else
return Pow1(X * X,n / 2) * X; // 如果不是偶数要多乘以一个X
}
long long Pow2(long long X,int n) //利用二进制写法
{ // 将n转换为2进制,例如10 1010 代表8*1 + 4*0 + 2*1 + 1*0
long long res = 1; // 因此n^10 = n^8 * n^2
while(n > 0)
{
if( n & 1) res = res * X; // 如果该二进制位为1 就乘上 X^m
X = X * X; // 每次循环更新X = X*X 即 X^2 , X^4, X^8, X^16, 等等
n >>= 1; // n = n >> 1; 每次向右移一位
return res;
}
int main(void) // 快速幂运算
{
long long t;
// t = Pow(2,10);
t = Pow2(2,10);printf("%lld",t);
return 0;
}