法1:
#include <stdio.h>
int MOD = 233333;
long long fastPower (int x,int n)
{
long long result = 1;
long long base =x;//n为指数,base为底数
while(n >0)
{
if(n%2 == 1)//检查n的二进制表示的最低位是否为 1
{
result=(result *base) % MOD;
}
base = (base * base) % MOD;
n /=2;//将n右移一位,相当于将二进制表示的最低位去掉。
}
return result;
}
int main()
{
int X,N;//n为指数,x为底数;若x取值较大时,则必须修改x的类型,否则将会出错
scanf("%d %d",&X,&N);
long long result = fastPower(X,N);
printf("%d",result);
return 0;
}
法2:
#include <stdio.h>
int MOD = 233333;
typedef long long ll;
int fastPower (int x,int n)
{
int result = 1;
while(n)
{
if(n&1)//检查n的二进制表示的最低位是否为 1
{
result=(ll)result *x % MOD;
}
n >>=1;//右移
x=(ll)x * x % MOD;
}
return result;
}
int main()
{
int X,N;
scanf("%d %d",&X,&N);
int result = fastPower(X,N);
printf("%d",result);
return 0;
}
快速幂算法(Exponentiation by Squaring)是一种用于高效计算幂运算的算法。它利用了指数的二进制展开,并通过不断平方和乘法的方式,以 O(logN) 的时间复杂度计算x^N。
快速幂算法的基本步骤:
-
将指数 N表示为二进制形式,如N=ak*(2^k)+ak-1*(2^k-1)+...+a1*(2^1)+a0*(2^0);
-
初始结果为result=1,初始底数为base=x。
-
从二进制表示的最高位开始(从左到右),依次处理每一位:
- 如果当前位 ai为1,将结果乘以当前底数,result×base。
- 将底数平方,base×base。
- 将指数右移一位,即N≫1。
-
重复步骤3直到指数N变为0,result中存储的就是x^N的结果。