标签:quick model ems 整数 off mode 比较 初始 sha
目录
剑指Offer-面试题14---剪绳子
https://leetcode-cn.com/problems/jian-sheng-zi-lcof/
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。2 <= n <= 58
这道题主要考察数学找规律的能力。数字>5时,尽量找出多的数字3。
public int CuttingRope(int n) { if (n == 2) return 1; if (n == 3) return 2; int result = 1; while (n>4) { n -= 3; result *= 3; } result *= n; return result; }
https://leetcode-cn.com/problems/jian-sheng-zi-ii-lcof/
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m] 。请问 k[0]*k[1]*...*k[m] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 2 <= n <= 1000
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
这题要考虑大数,既然我们主要计算3的个数,当数字比较大时,相当于有很多的3相乘,这时候用快速幂就很效率了。
private const int MODEL = 1000000007; public int CuttingRope(int n) { if (n == 2) return 1; if (n == 3) return 2; long result = 1; //需要切割的3的个数 long num3 = 0; while (n>4) { n -= 3; num3++; } result = QuickCal(3, num3); result = (result*n)% MODEL; return (int)result; } private long QuickCal(long a, long b) { long result = 1; a = a % MODEL; while (b > 0) { if (b%2==1) { b--; result = (result * a) % MODEL; } b /= 2; a = (a * a) % MODEL; } return result; }
标签:quick model ems 整数 off mode 比较 初始 sha
原文地址:https://www.cnblogs.com/Fflyqaq/p/12886540.html