注册 登录
编程论坛 数据结构与算法

设有一个长度为N的数字串,要求使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。

qunxingw 发布于 2012-10-22 00:08, 3013 次点击
在我的印象中,如果二个数之和为定值,那么在这二个数相等的情况下之积为最大,如5+5=10,则25为最大积,这二个数越向中间趋,之积就越大。
对于此题,我觉得K取一个*时才有最大积,(因为一个数不可能还有他本身的二个数相乘还大于他 如9999》99*99)而且这二个数要尽可能的接近才对,1111999最大积为(1111*999),  1111111(111*1111), 9999999 (9999*999)   1234567(1234*567)

不知是否正确,欢迎讨论。
7 回复
#2
寒风中的细雨2012-10-22 08:54
按照你上面的思路, 应该是对的
#3
qunxingw2012-10-22 20:56
感觉因这个和是不定的值,还有一重要的条件,就是“*”应该是最大的数之前(第一个数是不参与比较),9234567(923456*7)
如果同时有多个最大数字,原则上应该是尽可能向中趋向,如12456*888 ,如果第一个很小而第二个数又是最大,则*有可能在第二大数之前(171234*62)。
归纳如下,如果把“*”放在每个最大数,或放在每个次大数之前比较,应该可以找到最大之积。
#4
qunxingw2012-10-22 21:55
要求使用K个乘号将它分成K+1个部分,是不是也可能是大数字前优先放入*呢?
#5
寒风中的细雨2012-10-23 09:42
一个数No = {No(x)No(y)...No(n)}    x,y,n 分别表示数据的长度   总长度为L, L = x+y+...+n

No(原) = No(x)*10^(L-x) + No(y)*10^(L-x-y) +...+No(n)

新的数据值应该为No(新) = No(x)*No(y)*...*No(n)  

可知  No(x)*10^(L-x) > No(x)*No(y)*...*No(n)   
则可以得出=》K的值越小 相对而言数据被拆解的越大 No(x)*No(y)*...No(n)值越大
则No(新)越接近No(原)的值    -------------》最好是k为0

如果k的范围在[1, +oo),
No(原) = No(x)*10^y + No(y)    已知 L = x + y, (x, y >= 1)
No(新) = No(x) * No(y)
---------------------------------------现在只需要证明|x-y|的值越小No(新)的值越小
先证明一个方向的
已知, x < L - x, x' = x + 1, x' < L - x'
则有No(x')*No(L-x') = [No(x)*10+z]*[No(L-x)-z*10^(L-x-1)] =                                    ------------------ z 为个位数
N(x)*10*No(L-x) + z*No(L-x) - No(x)*z*10^(L-x) - z^2*10^(L-x-1)





[ 本帖最后由 寒风中的细雨 于 2012-10-23 09:46 编辑 ]
#6
寒风中的细雨2012-10-23 09:55
回复 5楼 寒风中的细雨
最后一段的证明不行
#7
pangding2012-10-23 23:28
以前有人问过,你可以参考一下:
https://bbs.bccn.net/thread-372126-1-1.html

这是个技术帖,里面确实有可行的办法。我认为是完美解决这个问题了,就是没代码。
楼主正好练练自己实现,实现好了帖出来,正好大家学习。

[ 本帖最后由 pangding 于 2012-10-23 23:30 编辑 ]
#8
寒风中的细雨2012-10-24 09:39
Ding~  可以写写
1