重庆智慧团建网站登录平台,企业品牌宣传型网站,建站之星网站模版商城,重庆安全员c证在哪里报名题目
2、3、3的三段#xff0c;此时得到的最大乘积是18。
答案需要取模 1e97#xff08;1000000007#xff09;#xff0c;如计算初始结果为#xff1a;1000000008#xff0c;请返回 1。 示例 1#xff1a; 输入: 2输出: 1解释: 2 1 1, 1 1 1 示例 2: 输入: 10输出…题目
2、3、3的三段此时得到的最大乘积是18。
答案需要取模 1e971000000007如计算初始结果为1000000008请返回 1。 示例 1 输入: 2输出: 1解释: 2 1 1, 1 × 1 1 示例 2: 输入: 10输出: 36解释: 10 3 3 4, 3 × 3 × 4 36 提示
2 n 1000 解题思路 1.题目要求我们将绳子剪切为乘积最大的 m 段这个题的解题思路与剑指 Offer 14- I. 剪绳子基本相同大家可以先去学习一下。唯一有一点不同的是这道题需要我们取模。 2.那在这里我们只讲解一下大数取余的方法 余数定理推导过程略 (ab)%p ((a%p)(b%p))%p 在每次乘法运算后都加上求余操作则最终的结果就是想要求得的余数在代码中体现在 pow 函数的for循环中 res (res * a) % p;就是在每次乘法运算后都加上求余操作 因此 循环求余法 循环求幂次每次乘法运算后求余数 。所以大数求余的本质实际就是通过“求幂次的方法余数定理”将原本要一次完成的操作分解到了求幂次过程的每一次循环中每次乘法操作都求一次余数。 3.因为在计算过程中res有可能超出类型所以我们将res设置为 long 类型。那在cuttingRope() 函数的返回值中我们就要将pow返回的 long 类型强转为 int 类型但是在 mod 1 和 mod 2 时有可能 pow 的返回值乘以 4 或者乘以 2 后依旧为 long 类型所以我们要将相乘后的值再次取余后再进行强转。 代码实现
class Solution {public int cuttingRope(int n) {if(n 2){return 1;}if(n 3){return 2;}int res n / 3;int mod n % 3;int p 1000000007;if(mod 0){return (int)pow(3,res);}else if(mod 1){return (int)(pow(3,res - 1) * 4 % p);}else {return (int)(pow(3,res) * 2 % 1000000007);}}long pow(int a, int k){long res 1;int p 1000000007;for(int i 1; i k; i){res (res * a) % p;}return res;}
}
测试结果