chongchuigu 发表于 2018-9-21 11:37:06

def findx(n):
    result=[]
    if n <= 4:
      result.append(n)
    elif n==6:
      result.extend()
    else:
      for i in range(2,9):
            if n%i==0 and n!=i:
                a=n//i
                if a>i and i != 2:
                  for j in range(a):
                        result.append(i)
                else:
                  for j in range(i):
                        result.append(a)
                break
      else:
            result.extend()
    return result

def a209(n):   
    result=[]
    a=findx(n)
    while result != a:
      result=a[:]
      a=[]
      for i in result:
            b=findx(i)
            a.extend(b)
    return result

n=int(input('请输入一个正整数:'))
result=a209(n)
s=1
s1=''
for i in result:
    s=s*i
s1='*'.join(str(i)for i in result)
print(s1,'=',s)

在东边 发表于 2018-9-21 14:15:41

from functools import reduce

def fun209(n):
    if n in (1, 2, 3, 4):
      return n
    k, r = divmod(n, 3)
    if r == 0:
      split_list = * k
    elif r == 1:
      split_list = + * (k - 1)
    else:
      split_list = * k +
    return "最大乘积是%d,使得乘积最大的拆分为:%s" % (reduce(lambda x, y: x * y, split_list), split_list)

骨傲天 发表于 2018-9-21 15:06:55

def f209(n):
    result,c=n,n
    if n:
      from math import sqrt
      re=sqrt(n)
      if re==int(re):
            if re**re>n:
                result,c=re**re,re
      else:
            for i in range(1,n+1):
                pd=i**(n//i)*(n%i) or i**(n//i)
                if pd>result:
                  result,c=pd,i
    return '%s的最大乘积是%d:%d'%(n,c,result)
for i in range(1,20):
    print(f209(i))

colinshi 发表于 2018-9-21 17:26:16

def func209(nums):
    if nums <= 4:
      return nums
    elif nums == 5:
      return '3 * 2'
    if nums % 3 == 0:
      return('3 * '* (nums // 3 - 1) + '3')
    else:
      return('3 * ' * (nums // 3 - 1) + str(3 + nums % 3))

print(func209(32))
print(func209(5))
print(func209(7))
不知道对不对,就是尽量把数字拆分成3的次方。

坠入暮光 发表于 2018-9-21 20:25:18

def max_product(n):
        i, j = divmod(n, 3)
        if j == 0:
                return 3**i
        elif j == 1:
                return 3**(i-1)*4
        else:
                return 3**i*2

print(max_product(9))

wyp02033 发表于 2018-9-23 23:42:55

from functools import reduce
from operator import mul
def find_max_split_product(num):
    product = num
    result =
    split_times = 2
    while True:
      split_num_list =
      less_value = num - sum(split_num_list)
      if less_value > 0:
            for i in range(less_value):
                split_num_list += 1
      split_num_profuct = reduce(mul, split_num_list, 1)
      if split_num_profuct > product:
            split_times += 1
            product = split_num_profuct
            result = split_num_list
      else:
            return product, result

wyp02033 发表于 2018-9-24 00:02:49

改进版,根据经验,最大乘积一般出现在划分次数为该数的三分之一处
from functools import reduce
from operator import mul
from time import perf_counter
def find_max_split_product(num, split_times):
    split_num_list =
    less_value = num - sum(split_num_list)
    if less_value > 0:
      for i in range(less_value):
            split_num_list += 1
    split_num_profuct = reduce(mul, split_num_list, 1)
    return split_num_profuct


def main():
    start = perf_counter()
    num = 7960
    split_times = num // 3 + 1

    while True:
      max_product = find_max_split_product(num, split_times)
      less_time_split_product = find_max_split_product(num, split_times-1)
      more_time_split_product = find_max_split_product(num, split_times+1)
      if less_time_split_product > max_product:
            split_times -= 1
      elif more_time_split_product > max_product:
            split_times += 1
      else:
            break
    stop = perf_counter()
    print("max_product:%d" % max_product)
    print("time used:", stop - start)
if __name__ == '__main__':
    main()

schen31 发表于 2018-9-24 05:32:40

本帖最后由 schen31 于 2018-9-24 05:52 编辑

#一个正整数n可以拆分为若干个正整数,这些正整数之和等于n,如何拆分使得拆分后的正整数的乘积最大。
number=int(input("输入一个正整数:"))
list=[]
for n in range(1,number+1):
    if number%n==0:
      a=number/n
      m1=n**a
      list.append(m1)
    else:
      yushu=number%n
      shang=number//n
      if yushu==1:
            m2=(n**(shang-1))*(n+1)
      else:
            m2=(n**shang)*yushu
      list.append(m2)
print(str(number)+"拆分后的乘积最大为:")
print(round(max(list)))

第一次答题,有点紧张

Chysial 发表于 2018-9-25 13:56:37

# 思路,生成1~n的最大数列,比较这n个最大数列哪个最大即可
def p209(n = 10):
    a = {}
    for j in range(1,n+1):
      b = []
      reminder = n%j
      for i in range(1,j+1):
            b.append(n//j)
      k = 0
      while reminder>0:
            b = b +1
            reminder -= 1
            k += 1
      a = b
    # 这样就形成了n个小型矩阵,比较他们的乘积便可以了
    max_value = []
    max_dict = {}
    for p in range(n):
      product = 1
      for every in a:
            product *= every
      max_value.append(product)
      max_dict = a
    # 比较输出最大的max_value
    print(max_dict)
p209(10)
         
这是我的理解,10最后结果是3,3,2,2{:5_109:},不知道对不

776667 发表于 2018-9-27 09:39:19

def fun209(x):
    if x%3 == 0:
      return
    elif x%3 == 1:
      return +
    elif x%3 == 2:
      return +

tkxlyytqy 发表于 2018-10-11 14:21:11

# -*- coding: utf-8 -*-
n = int(input("请输入一个数字"))
if n % 2 == 0:
    div = n / 2
    mul = div ** 2
    print("%d 拆分后的最大值是%d" %(n ,mul))
else:
    div1 = n // 2
    mul = (div1+1)*(div1-1)
    print("%d 拆分后的最大值是%d" % (n, mul))

喜欢吃菠菜 发表于 2018-10-16 15:22:07

本帖最后由 喜欢吃菠菜 于 2018-10-16 15:40 编辑

def divtocols(num,col,tmp,index,res):
    """
       参数说明:num是要分解的整数,col要分解成的列数,比如5分成就是2列,临时列表tmp格式:[]*col,res要返回的结果
       思路:分解一个数最终就是化解成一个数分成2个整数,
       比如5要分成3列数,先分...,再剥第二列4,3分成两列],],],以此类推
    """
    if num==1 or col==1:
      res.append(num)
      return
    if num==col:
      res.extend(*col)
      return
    if col==2:
      for i in range(1,num//col+1):
            tmp[-2],tmp[-1]=i,num-i
            #print(tmp)
            res.append(tmp[:])
    for i in range(1,num//col+1):
      if col<=2:break
      tmp=i
      divtocols(num-i,col-1,tmp,index+1,res) #不能用递归返回 return 很重要,否则 for语句将不执行
#----------------------------------------------------------
def splitnum(num):
    res=[]
    for col in range(1,num+1):
      arr=[]
      tmp=*col
      divtocols(num,col,tmp,0,arr)
      res.append(arr[:])
    return res

res=splitnum(6)
for l in res:
    print(l)
结果:

[, , ]
[, , , ]
[, ]
[]


#分解的问题解决了,剩下的计算乘积等问题,就不是问题了。

pushpush 发表于 2018-10-17 23:41:51

def get_value(num):
    max = num
    if num < 4:
      return max
    else:
      division, remaider = num // 3, num % 3
      if remaider == 0:
            max = 3 ** division
      elif remaider == 1:
            max = 3 ** (division-1) * 4
      else:
            max = 3 ** division * 2
    print max

num = 20
get_value(num)

xy123151 发表于 2018-11-25 22:33:33

本帖最后由 xy123151 于 2018-11-25 22:36 编辑

已删除

sunrise085 发表于 2019-1-10 16:48:43

num=input("请输入一个正整数:")
n=num//3
a=num%3
mylist=[]
result=0
if a==1:
        for i in range (n-1):
                mylist.append(3)
        if n>1:
                mylist.extend()
                result=3**(n-1)*4
        elif n==1:
                mylist.append(4)
                result=4
        else:
                mylist.append(1)
                result=1
else:
        for i in range (n):
                mylist.append(3)
        result=3**n
        if a==2:
                mylist.append(2)
                result=3**n*2
print('将%d拆分成:' %num,mylist,',乘积计算值最大为%d' %result)
页: 1 [2]
查看完整版本: Python:每日一题 209