题目
分析
高精度
首先,这道题目需要用到高精度乘法,但在本文中不展开说明,而只是给出一个比较精简的代码。
核心算法
先分析一个样本数据:如果数字的和是10
,那么怎么拆分呢?
我第一个想到的是,算术平均大于几何平均:\(\frac{a+b}{2}\ge\sqrt {a\times b}\),而等号成立当且仅当\(a==b\)时。但是测了一下,发现不是这么简单。比如10=5+5
,进一步变化为4+6
,此时\(4\times 6=24\),但这不是最大的——最大的乘积出现在\(2\times 3\times 5\)。又试了几个,发现了另一个算法。
从2
开始,依次加3
,加4
……但保证最后还是\(2+3+4+...+k\lt n\),到最后,一定存在一个差值\(diff=sum+(k+1)-n\)。根据这个\(diff\),有几种处理方式:
diff==0
,那么k+1
可以直接加入。diff==1
,那么去掉2
,最后一个k
变成k+1
即可。diff>=2
,直接去掉某个等于diff
的数即可。
这个算法的基础在于,对于比较大的n
,\((n/2)!\)一定比\(n/2\times n/2=n^2/4\)大。
答案
思考
(略)