冬雪雪冬 发表于 2018-9-20 09:02:12

Python:每日一题 209

本帖最后由 冬雪雪冬 于 2018-9-24 19:53 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。开始阶段是看不到其他人的回帖的,等答题完成,开始评分时再取消限制。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
一个正整数n可以拆分为若干个正整数,这些正整数之和等于n,如何拆分使得拆分后的正整数的乘积最大。
如9可以拆分为:
3,3,3。乘积是27
2,2,2,3。乘积是24
1,1,1,1,1,1,1,1,1.乘积是1
......
最大值为27。
当然有的数不拆分最大,如1,2,3,4
给一个正整数,求出拆分后乘积最大数,如果不拆分结果最大就给出不拆分的结果。

提示如果将一个数拆分为2个数,则2个数接近或相等乘积最大。

凌九霄 发表于 2018-9-20 09:16:38

本帖最后由 凌九霄 于 2018-9-20 14:52 编辑

def func209(n):
    if n == 1: return 1
    r, q = n % 3, n // 3
    if r == 0:
      return 3 ** q
    elif r == 1:
      return 3 ** (q - 1) * 4
    elif r == 2:
      return 3 ** q * 2

塔利班 发表于 2018-9-20 09:52:39

本帖最后由 塔利班 于 2018-9-21 16:17 编辑

def fun209(n):
    if n<5:
      L=
    else:
      a,b=divmod(n,3)
      t={0:,1:,2:}
      L=*(a-1)+[*t]
    print(*L)

def fun209(n):
    L=[]
    while n>4:
      n-=3
      L.append(3)
    L.append(n)
    print(*L)

拉成一条
def fun209(n):
    print(*( if n<5 else (*(n//3) if n%3==0 else(*(n//3-1)+ if n%3==1else *(n//3)+))))

JessiFly 发表于 2018-9-20 10:32:34

#拆分出的正整数应不超过4,4可以转化为2的问题,5可以转化为2和3的问题。
#所以应该尽可能拆分出3,然后拆分为2,不能分出1。

def fun209(n):
    split_list = []
    mul = 1
   
    if n < 5:
      split_list.append(n)
    else:
      #能被3整除则全部拆分为3
      if n%3 == 0:
            for i in range(n//3):
                split_list.append(3)
      #被3除余1则拆分为2个2,剩下的为3
      elif n%3 == 1:
            for i in range(2):
                split_list.append(2)
            for i in range((n-4)//3):
                split_list.append(3)
      #被3除余2则拆分为1个2,剩下的为3
      else:
            split_list.append(2)
            for i in range((n-2)//3):
                split_list.append(3)
      
    print('正整数%d可拆分为:' %n, end=' ')
    for each in split_list:
      print(each, end=' ')
      mul *= each
    print('\t乘积为%d' %mul)


if __name__ == '__main__':
    for i in range(1,11):
      fun209(i)

grf1973 发表于 2018-9-20 11:06:25

def maxsplit(n):#选用尽量多的3,直到剩下2或4
        res,s=1,''
        while n>4:
                n-=3
                res*=3
                s+='*3'
        res*=n
        s+='*'+str(n)
        return '%s=%d'%(s,res)

print(maxsplit(50))

天圆突破 发表于 2018-9-20 12:56:28

本帖最后由 天圆突破 于 2018-9-20 13:01 编辑

def func209(n: int):
    m, p = n//3, n%3
    return [ 3 for _ in range(m-1 if p==1 else m)] +

FC的注册很坑 发表于 2018-9-20 13:46:05

def func209(num):
    len=num//2
    max=num
    for i in range(2,len+1):
      element=num//i
      rest=num%i
      multiple=element**(i-rest)*(element+1)**rest
      if max<multiple:
            max=multiple
    print(max)
      
func209(9)

Legend丶Hu 发表于 2018-9-20 13:56:38

n = int(input())
a3 = [];
a2 = [];
while n >= 3:
    if n - 3 == 1:
      break
    a3.append(3)
    n -= 3
while n >= 2:
    a2.append(2)
    n -= 2
x = 1;
for i in a3:
    x *= i
for i in a2:
    x *= i
print(x)

wuli03960405 发表于 2018-9-20 14:07:01

这是个嘛

raphael213 发表于 2018-9-20 14:20:47

# 发觉3*3*3。。。积一直最大,就这样写了。。。看看别人的

number = int(input('輸入一个数:'))
余数 = number % 3
指数 = (number - 余数) // 3
if 余数 == 0:
    乘积 = 3 ** 指数
else:
    乘积 = 3 ** 指数 * 余数
print('乘积是:',乘积)

君扬 发表于 2018-9-20 16:05:56

还好

晓屁屁 发表于 2018-9-20 16:32:44

def noy(n1,n):
    n1 *= 3
    if n <= 7:
      return n1 , n
    else:
      n -= 3
      return n1,n

def yu2(n1,n):
    n1 *= 2
    if n <= 6:
      return n1,n
    else:
      n -= 2
      return n1,n

num = int(input('---->'))
n = num
n1 = 1
list1 = []
while True:
    if n == 5:
      list1.append(2)
      list1.append(3)
      n1 *= 2
      n1 *= 3
      print(list1,n1)
      break
    elif n == 6:
      list1.append(3)
      list1.append(3)
      n1 *= 3
      n1 *= 3
      print(list1, n1)
      break
    elif n == 7:
      list1.append(3)
      list1.append(2)
      list1.append(2)
      print(list1,3*2*2)
      break
    if num <= 4 and num >= 0:
      print(num)
      break
    if n%3 != 0 and n%2 != 0:
      n1,n = noy(n1,n)
      list1.append(3)
    elif n%3 == 0:
      n1,n = noy(n1,n)
      list1.append(3)
    elif n%2 == 0:
      n1,n = yu2(n1,n)
      list1.append(2)

写的有点糙,而且不知道思路对不对

Evolution.Era 发表于 2018-9-20 17:05:58

{:10_266:}{:10_266:}{:10_266:}{:10_266:}{:10_266:}
number = int(input('请输入一个数:'))
def chaifen(number,dict_result = {}): # dict_result[乘积结果] = 拆分后数的列表 如 dict_result =
   # i 为拆分数量
    for i in range(1,number+1):
      # 初始化 result 存放乘积结果 list_result 存放拆分后的数 num用于保证原始数不被修改
      result = 1
      list_result = []
      num = number

      # 如果拆分数量=1,则不拆分直接保存
      if i == 1 :
            dict_result = number
      else:
            # 拆分方法 如 9
            # 拆分成两个数 9//2 = 4(9-4)//1 = 5 则拆分的两个数为 4,5
            # 拆分成三个数 9//3 = 3(9-3)//2 = 3 (9-3-3)//1 = 3 则拆分的三个数为 3,3,3
            while i > 0 :
                temp = num//i            
                list_result.append(temp)
                num = num - temp
                i -=1
            for each in list_result:
                result *= each
            dict_result = list_result

    return dict_result

r = chaifen(number)
max_key = max(r.keys())
print('乘积最大数为:%d ,其拆分结果为 :' % max_key , r)

HISIOISIH 发表于 2018-9-20 19:59:45

while 1:
    temp=int(input("请输入一个正整数"))
    list1=
    if temp in list1:
      print(temp)
    else:
      a=temp/3
      b=temp%3
      if b==0:
            print(3**a)
      else:
            print(3**a*b)

jiaozhu80 发表于 2018-9-20 20:58:36

def max_product(n):
    s=
    result=
    if n not in s:
      num1=n//3
      num2=n%3
      result.remove(n)
    if num2==1:
      result.append(4)
      num1-=1
      while num1:
            result.append(3)
            num1-=1
    elif num2==2:
      result.append(2)
      while num1:
            result.append(3)
            num1-=1
    else:
      while num1:
            result.append(3)
            num1-=1
    return result

子沙 发表于 2018-9-20 21:46:01

def fun_209(x):
    max_mul=x
    for i in range(2,x//2+1):
      if x%i==0:
            if i**(x//i)>max_mul:
                max_mul=i**(x//i)
      elif x%i==1:
            if i**(x//i-1)*(1+i)>max_mul:
                max_mul=i**(x//i-1)*(1+i)
      else:
            if i**(x//i)*(x%i)>max_mul:
                max_mul=i**(x//i)*(x%i)
    return max_mul
print(fun_209(9))
print(fun_209(100))

没有土豆的洋芋 发表于 2018-9-20 22:21:42

import numpy as np

number = random.randint(0, 9)

products=0
max_a=[]

for i in range(1,number+1):
    for j in range(1000):
      re = 1
      a = np.random.randint(1, number+1,i)
      list_sum = sum(a)
      if list_sum == number:
            for k in range(i):
                re=re*a
                if re > products:
                  products = re
                  max_a.append(a)
                else:
                  products = products

print("The made number:%d"%(number))
print("The max product:%d"%(products))

jerryxjr1220 发表于 2018-9-21 09:19:39

本帖最后由 jerryxjr1220 于 2018-9-21 09:22 编辑

好久没来了,这题有意思{:5_109:}
dic = {1:1, 2:2, 3:3, 4:4}
def calc(n):
        for i in range(2,int(n/2)+1):
                j = n-i
                if j not in dic:
                        dic = calc(j)
                if n not in dic:
                        dic = dic*dic
                else:
                        if dic*dic>dic:
                                dic = dic*dic
        return dic

archlzy 发表于 2018-9-21 09:41:12

def q209(num):
    if num == 1:
      return 1
    elif num % 3 == 0:
      return 3 ** (num//3)
    else:
      return (3 ** (num//3 - 2 + num % 3)) * 2 * (3 - num % 3)

翩跹叶惊鸿 发表于 2018-9-21 10:29:11

本帖最后由 翩跹叶惊鸿 于 2018-9-22 20:33 编辑

n = int(input('请输入一个正整数:'))

def chaifen(n):
    x = n//2
    y = n - n//2
    if x > 4:
      x = chaifen(x)
    if y > 4:
      y = chaifen(y)
    a = x * y
    z = n//3
    if n//3 == n/3:
      if z > 4:
            z = chaifen(z)
      b = z**3
    else:
      b = 0
    return max(a,b,n)

print(chaifen(n))



试了几个比较小的数,应该是没问题的。说一下我的思路:
1.首先根据主楼那个提示:如果将一个数拆分为2个数,则2个数接近或相等乘积最大。
于是,先把n拆成接近或相等的2个部分(也是代码中的x和y);
2.然后当n大于4,拆分后一定比n大;当n小于等于4,不拆分最大。
于是,进行判断,若其中一部分(x或y)比4大,那就再进行拆分,并用拆分后得到的乘积来代替那一部分。
比方说,10先被拆分成5*5,然后每个5都被拆成2*3,也就是10被拆成了(2*3)*(2*3),输出最大的是36。
如果数字比较大,要拆多少次这个就没法确定,于是我用的一个递归,会一直的拆下去,直到每一部分都小于等于4为止。
3.考虑到主楼例子里的那个拆成3个完全相等部分的情况【PS:我使用小一点的数进行了多次尝试,如果不是完全相等一定会比 2部分2部分的拆 得到的结果小
如果能被分成完全相等的3个部分(代码中的z),就判断第一种拆分(2部分2部分的拆)得到的积(代码中的a)和这个分成3部分后得到的积(代码中的b)哪个大。
当然也需要判断这个z是不是比4大!如果比4大就还能再进行拆分,并用拆分后得到的乘积来代替。比方说15能拆成5 5 5,而每个5都被拆成2*3,得到的应该是(2*3)^3 = 216。
4.因为没有单独判断n是否大于4,于是在return的那个max里面加上了n,也就是说, 如果输入的是1234就会输出本身了,因为当n小于等于4,不拆分最大。

理论上这个代码多大的数都能进行拆分并输出最大的乘积,我只尝试了较小的数,数字大了不太好验证。
如果这个代码哪里有BUG 也欢迎指正。


页: [1] 2
查看完整版本: Python:每日一题 209