剑指offer 14. 剪绳子II(大数求余)

2020年12月4日 周五天气晴 【不悲叹过去,不荒废现在,不惧怕未来】


在这里插入图片描述
这道题主体和 剑指offer 14. 剪绳子 一样,唯一不同的就是本题涉及到大数越界情况下的取余问题

class Solution {
public:
    int cuttingRope(int n) {
		if (n <= 3) return n - 1;
		int a = n / 3, b = n % 3, ans = 0, mod = 1000000007;
			
		if (b == 0) ans = Pow(3, a, mod);
		else if (b == 1) ans = Pow(3, a - 1, mod) * 4 % mod; // *4后的结果可能大于mod,因此需要再次取余
		else ans = Pow(3, a, mod) * 2 % mod;
		return ans;
    }

	// 快速幂算法,对 1000000007 取余
    long long Pow(long long base, long long power, int mod){
        long long res = 1;
        while(power != 0){
            if(power&1)
                res = res * base % mod;
            power >>= 1;
            base = base * base % mod;
        }
        return res;
    }
};

这里使用的是快速幂算法,具体参考了这篇文章 快速幂算法(全网最详细地带你从零开始一步一步优化)


参考文献

快速幂算法(全网最详细地带你从零开始一步一步优化)
《剑指offer 第二版》

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值