快速幂取模-c语言

法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。

快速幂算法的基本步骤:

  1. 将指数 N表示为二进制形式,如N=ak*(2^k)+ak-1*(2^k-1)+...+a1*(2^1)+a0*(2^0);

  2. 初始结果为result=1,初始底数为base=x。

  3. 从二进制表示的最高位开始(从左到右),依次处理每一位:

    • 如果当前位 a​i为1,将结果乘以当前底数,result×base。
    • 将底数平方,base×base。
    • 将指数右移一位,即N≫1。
  4. 重复步骤3直到指数N变为0,result中存储的就是x^N的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值