招商银行在线测试题之整数拆分乘积最大化

题目描述:给定一个正整数,拆分成至少两个整数之和,使这些项的乘积最大化,输出获得的最大乘积。

测试用例:输入 2 输出 1 ;输入10 输出 36 ;(10=3+3+4)

  • 思路:乘积最大化也就是每次分解都使得分解后的乘积值不比未分解数值小,由此每一次分解都将乘积的值都将不变或者变大,从而使得数值不断变大。
  • 对于给定正整数n,若n<4时n分解后的乘积的取值只能是1、2、3,当n=3时分解后乘积最大值为2;当n为1或2时,乘积最大值为1;当n>4时可以分解为n= a + (n-a),其中a,n-a均大于等于2,可以证明分解后的乘积a*(n-a)-n=(a-1)(n-a)-a>=(a-1)*2-a=a-2>=0,即由n分解成n+(n-a),乘积不减。
  • 当a或n-a也大于等于4时,同样a或n-a又可以作为新的n进行上述分解,以此类推,直到分解后a和n-a均小于4,由于“1”值对于乘积没有贡献,所以最终的乘积的因子只会取“2”或者"3"。
  • 由于6=3+3=2+2+2但3*3=9>2*2*2=8故每拆分出一个6尽可能换成两个3。
  • 考虑n%6的情况,当n%6为偶数时,那么拆分成floor(n/6)个6和(n%6)/2个2即n拆分成2*floor(n/6)个3和(n%6)/2个2的和使得乘积最大化,最大值为3^(2*floor(n/6))*2^((n%6)/2);当n%6为奇数时,1)n%6=3或者5,可以提前拆分出一个3,再按(n-3)%6为偶数的方式拆分,因为直接按n%6为偶数的方式拆分会出现1,显然对于乘积变大无贡献(3=2+1,5=2+2+1); 2)n%6=1,仍然可以提前拆分出一个3,此时(n-3)%6会为4,显然这种拆分方式值更大(6*1<3*2*2)。
  • 综合上述分析,可以得出如下表达式:

  • python 编写的代码如下:
def max_product(n):

    if n == 1:#1+0
        product = 0
    elif n == 2:#1+1
        product = 1
    elif n == 3:#1+2
        product = 2
    else:#n>4 ,n=a+(n-a)
        if (n%6)%2 == 0:#余数为偶数
            product = 1
        else:#余数为奇数
            product = 3
            n = n-3
        product = product * pow(3,(n/6)*2) * pow(2,(n%6)/2)

    return product


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值