自然数分解求最大乘积

题目:

把正整数n分解成若干个互不相等的自然数的和,且使这些自然数的乘积最大。请你编写一个算法,由键盘输入n,求满足条件的分解方案。

输入: n (3<=n<=1000)

输出:乘积

分析:如果不探究解析方法而去盲目搜索所有分解方案的话,代价相当大。但其中是有数学规律滴…(这里让正整数是s,分解个数是n哈)
s = a 1 + a 2 + , ⋯   , + a n ( 1 ⩽ a 1 < a 2 < ⋯ < a n ) a 1 + a 2 2 ⩾ a 1 a 2 ( a 1 + a 2 + ⋯ + a n n ) ⩾ a 1 a 2 ⋯ a n n ,  即  ( s n ) n ⩾ a 1 a 2 ⋯ a n \begin{array}{c} s=a_{1}+a_{2}+, \cdots,+a_{n} \quad\left(1 \leqslant a_{1}<a_{2}<\cdots<a_{n}\right)\\\\ \frac{a_{1}+a_{2}}{2} \geqslant \sqrt{a_{1} a_{2}} \\\\ \left(\frac{a_{1}+a_{2}+\cdots+a_{n}}{n}\right) \geqslant \sqrt[n]{a_{1}a_{2}\cdots a_{n}}, \text { 即 }\left(\frac{s}{n}\right)^{n} \geqslant a_{1}a_{2}\cdots a_{n} \end{array} s=a1+a2+,,+an(1a1<a2<<an)2a1+a2a1a2 (na1+a2++an)na1a2an ,  (ns)na1a2an

  1. a1>1
  2. 1<=ai+1-ai<=2,因为如果出现>2,可以将ai+1、ai改为ai+1-1、ai+1,使得到的乘积更大
  3. 最多只有一个i,使得ai+1-ai=2 ⬅为了让拆的数尽量多。。这里感觉不太严谨,跟数学建模出了个策略似的((谁来告诉我怎么证QAQ

总结策略如下:

把数按自然数顺序拆成2, 3, 4…an, an+1, an+1里是拆剩下的数。当an+1<=an时不合题意,要把它拆了分给前边的数。

  1. an+1=an时,因为an及之后的数每数加1还剩个1,只能把这个1分给an
  2. 1<an+1<an时,从an起向a1走,每个数挨个加1
  3. an+1=1时,只能加到ai

3,4这俩数比较特殊,如果必须拆的话只能拆成1+2、1+3。

太辣鸡了只会用python了

s=int(input())
if s==3 or s==4:
    result=s-1
else:
    divd=[]
    a=2
    while s>=a:
        s-=a
        divd.append(a)
        a+=1
    if s==1:
        divd[-1]+=1
    elif s==a-1:
        for i in range(a-2):#a-2:现在拆了n项(an+1不算进去)
            divd[i]+=1
        divd[-1]+=1
    else:
        i=a-3#第n项的下标
        while s>0:
            divd[i]+=1
            s-=1
            i-=1
    result=1
    for num in divd:
        result*=num

print('%d'%result)
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值