自然数分解求最大乘积

题目:

把正整数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)

猜你喜欢

转载自blog.csdn.net/qq_45268474/article/details/107998734