作为一道编程题,这道题还是很简单的。简单的观察就能知道拆出足够多的 3 就能使得乘积最大。
int integerBreak(int n)
{
if(n == 2) return 1;
if(n == 3) return 2;
int ret = 1;
while( n>4 )
{
ret *= 3;
n -= 3;
}
return ret * n;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
这道题的难点其实在于证明为什么拆出足够多的 33 就能使得乘积最大。下面我就试着证明一下。
首先证明拆出的因子大于 4 是不行的。设 xx 是一个因子,x>4x>4,那么可以将这个因子再拆成两个因子 x−2x−2 和 22,易证 (x−2)×2>x(x−2)×2>x。所以不能有大于 4 的因子。
44 这个因子也是可有可无的,4=2+24=2+2,4=2×24=2×2。因此 44 这个因子可以用两个 22 代替。
除非没有别的因子可用,11 也不能选作因子。一个数 xx 当它大于 3 时,有 (x−2)×2>(x−1)×1(x−2)×2>(x−1)×1。
这样呢,就只剩下 22 和 33 这两个因子可以选了。下面再证明 33 比 22 好。
一个数 x=3m+2nx=3m+2n,那么 f=3m×2n=3m×2x−3m2f=3m×2n=3m×2x−3m2 可以对它取个对数。
lnf===mln3+nln2mln3+x−3m2ln2x2ln2+(ln3−32ln2)mlnf=mln3+nln2=mln3+x−3m2ln2=x2ln2+(ln3−32ln2)m
其中 ln3−32ln2>0ln3−32ln2>0 所以 ff 是 mm 的增函数,也就是说 mm 越大越好。所以 33 越多越好。
再多说一句,如果拆出的因子不限于整数的话,可以证明e=2.718…e=2.718… 是最佳的选择。感兴趣的可以试着证明一下。