Integer Break 整数拆分

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

例如,给定 n = 2,返回1(2 = 1 + 1);给定 n = 10,返回36(10 = 3 + 3 + 4)。

注意:你可以假设 不小于2且不大于58。

感谢:
特别感谢 @jianchao.li.fighter 添加此问题并创建所有测试用例。

思路:这道题就是数学的考察,对于任何大于4的数,都应该尽量把他分解成3的乘积,具体原理如下所示(不想看可以跳过)。

假设n可以拆分成k个实数(而非正整数)的和:n=km,那么相应的乘积是pow(m, k) = pow(n/k, k), 要maximize这个值,take log, f = k(ln(n)-ln(k)), then take derivative, f' = ln(n) - ln(k) - 1 = 0。所以optimal 的k = n/e,相应的m=e=2.7...。所以如果m是正整数的话,尽可能的向3 round up,剩下的2来凑。
如果剩下的数小于4就不再分解,如果等于4(4=2*2,和没有分解一样),如果等于3(分解为2+1没有自己3大(3>2*1))。

参考代码:

    int integerBreak(int n) {
	if (n == 2) {
		return 1;
	}
	if (n == 3) {
		return 2;
	}
	if (n == 4) {
		return 4;
	}
	int res = 1;
	while (n > 4) {
		res*=3;
		n -= 3;
	}
	return res*n;        
    }





给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

例如,给定 n = 2,返回1(2 = 1 + 1);给定 n = 10,返回36(10 = 3 + 3 + 4)。

注意:你可以假设 不小于2且不大于58。

感谢:
特别感谢 @jianchao.li.fighter 添加此问题并创建所有测试用例。

你可能感兴趣的:(算法)