快速幂(2065)

应用场景:求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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值