题目描述:
一日,某小学生问作业:“将16分解为若干素数的和,求这些素数积的最大值”。不禁被吓了一跳。怎么小学生的数学题变得这么难了?
细细询问,小学生没学不等式,没学数学归纳法……。那么只能用最笨的办法——穷举,一个个地试的办法来解决。
穷举之道,在于一一举来,不多不少;而不多不少,则在于有条有理,从容不乱。
细细询问,小学生没学不等式,没学数学归纳法……。那么只能用最笨的办法——穷举,一个个地试的办法来解决。
穷举之道,在于一一举来,不多不少;而不多不少,则在于有条有理,从容不乱。
解决方案1(暂只看到这个):
1. 由A-G不等式:n个数的算数平均值>=n个数的几何平均值:
(a1+a2+a3+....+an)/n >=(a1*a2*a3*...*an)^(1/n).
等号仅在a1=a2=...=an取得。在和相等的情况下,原命题变为
求(16/n)^n 的最值问题,当然16可以是任意的。可以得到 n=16/e (e=2.71828) 最大。
求导我自己推理过,恰好网上也有这个部分,链接http://blog.csdn.net/pathuang68/article/details/6606605。
2. 以上求导过程值说明了(16/x)^x在何处最大,讨论整数情况时,要考虑上向上取整还是向下取整,例如16/e=5.88. 可以取5或者6.此时可以求两阶导数(= -1/x),当然直接数学验证也可以,可知取6最大。
3. 再考虑分解为素数16/6=2.7,距离2.7最近的素数为3.其实无论是16还是17,距离解出来最近的数字都是3.
所以如果一个数恰好为3的倍数,则分解成3xn是的成绩最大=3^n. 如果不能分解为3的倍数,考虑余数为1或者2. 余数为1时,考虑2x2 >3x1,即3n+1型分解为3(n-1)+2+2,乘积=3^(n-1)*4;3n+2型,最值=3^n*2.
4.写code的时候,依据以上结论,将是很简单的。不是我懒,是我代码太丑了。。。。。
int MaxProduct (int n)
{
if(n==0 || n==1 || n==2)
return n;
if(n%3==1)
return power(3,(n-4)/3)*2*2;
if(n%3==2)
return power(3,(n-2)/3)*2;
return power(3,n/3);
}
(a1+a2+a3+....+an)/n >=(a1*a2*a3*...*an)^(1/n).
等号仅在a1=a2=...=an取得。在和相等的情况下,原命题变为
求(16/n)^n 的最值问题,当然16可以是任意的。可以得到 n=16/e (e=2.71828) 最大。
求导我自己推理过,恰好网上也有这个部分,链接http://blog.csdn.net/pathuang68/article/details/6606605。
2. 以上求导过程值说明了(16/x)^x在何处最大,讨论整数情况时,要考虑上向上取整还是向下取整,例如16/e=5.88. 可以取5或者6.此时可以求两阶导数(= -1/x),当然直接数学验证也可以,可知取6最大。
3. 再考虑分解为素数16/6=2.7,距离2.7最近的素数为3.其实无论是16还是17,距离解出来最近的数字都是3.
所以如果一个数恰好为3的倍数,则分解成3xn是的成绩最大=3^n. 如果不能分解为3的倍数,考虑余数为1或者2. 余数为1时,考虑2x2 >3x1,即3n+1型分解为3(n-1)+2+2,乘积=3^(n-1)*4;3n+2型,最值=3^n*2.
4.写code的时候,依据以上结论,将是很简单的。不是我懒,是我代码太丑了。。。。。
int MaxProduct (int n)
{
if(n==0 || n==1 || n==2)
return n;
if(n%3==1)
return power(3,(n-4)/3)*2*2;
if(n%3==2)
return power(3,(n-2)/3)*2;
return power(3,n/3);
}