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) 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) 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)) 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的次方。 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)) 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 改进版,根据经验,最大乘积一般出现在划分次数为该数的三分之一处
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: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)))
第一次答题,有点紧张 # 思路,生成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:},不知道对不 def fun209(x):
if x%3 == 0:
return
elif x%3 == 1:
return +
elif x%3 == 2:
return + # -*- 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: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)
结果:
[, , ]
[, , , ]
[, ]
[]
#分解的问题解决了,剩下的计算乘积等问题,就不是问题了。 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:36 编辑
已删除 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]