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 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-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)+))))
#拆分出的正整数应不超过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) 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 13:01 编辑
def func209(n: int):
m, p = n//3, n%3
return [ 3 for _ in range(m-1 if p==1 else m)] + 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) 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)
这是个嘛 # 发觉3*3*3。。。积一直最大,就这样写了。。。看看别人的
number = int(input('輸入一个数:'))
余数 = number % 3
指数 = (number - 余数) // 3
if 余数 == 0:
乘积 = 3 ** 指数
else:
乘积 = 3 ** 指数 * 余数
print('乘积是:',乘积)
还好
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)
写的有点糙,而且不知道思路对不对 {: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) 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) 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 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))
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: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 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-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