鱼C论坛

 找回密码
 立即注册
查看: 3724|回复: 40

[技术交流] Python:每日一题 209

[复制链接]
发表于 2018-9-20 09:02:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 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个数接近或相等乘积最大。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-20 09:16:38 | 显示全部楼层
本帖最后由 凌九霄 于 2018-9-20 14:52 编辑
  1. def func209(n):
  2.     if n == 1: return 1
  3.     r, q = n % 3, n // 3
  4.     if r == 0:
  5.         return 3 ** q
  6.     elif r == 1:
  7.         return 3 ** (q - 1) * 4
  8.     elif r == 2:
  9.         return 3 ** q * 2
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-9-20 09:52:39 | 显示全部楼层
本帖最后由 塔利班 于 2018-9-21 16:17 编辑
  1. def fun209(n):
  2.     if n<5:
  3.         L=[n]
  4.     else:
  5.         a,b=divmod(n,3)
  6.         t={0:[3],1:[4],2:[3,2]}
  7.         L=[3]*(a-1)+[*t[b]]
  8.     print(*L)
复制代码

  1. def fun209(n):
  2.     L=[]
  3.     while n>4:
  4.         n-=3
  5.         L.append(3)
  6.     L.append(n)
  7.     print(*L)
复制代码


拉成一条
  1. def fun209(n):
  2.     print(*([n] if n<5 else ([3]*(n//3) if n%3==0 else([3]*(n//3-1)+[4] if n%3==1  else [3]*(n//3)+[2]))))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-20 10:32:34 | 显示全部楼层
  1. #拆分出的正整数应不超过4,4可以转化为2的问题,5可以转化为2和3的问题。
  2. #所以应该尽可能拆分出3,然后拆分为2,不能分出1。

  3. def fun209(n):
  4.     split_list = []
  5.     mul = 1
  6.    
  7.     if n < 5:
  8.         split_list.append(n)
  9.     else:
  10.         #能被3整除则全部拆分为3
  11.         if n%3 == 0:
  12.             for i in range(n//3):
  13.                 split_list.append(3)
  14.         #被3除余1则拆分为2个2,剩下的为3
  15.         elif n%3 == 1:
  16.             for i in range(2):
  17.                 split_list.append(2)
  18.             for i in range((n-4)//3):
  19.                 split_list.append(3)
  20.         #被3除余2则拆分为1个2,剩下的为3
  21.         else:
  22.             split_list.append(2)
  23.             for i in range((n-2)//3):
  24.                 split_list.append(3)
  25.         
  26.     print('正整数%d可拆分为:' %n, end=' ')
  27.     for each in split_list:
  28.         print(each, end=' ')
  29.         mul *= each
  30.     print('\t乘积为%d' %mul)


  31. if __name__ == '__main__':
  32.     for i in range(1,11):
  33.         fun209(i)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[1:],res)

print(maxsplit(50))

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-20 12:56:28 | 显示全部楼层
本帖最后由 天圆突破 于 2018-9-20 13:01 编辑
  1. def func209(n: int):
  2.     m, p = n//3, n%3
  3.     return [ 3 for _ in range(m-1 if p==1 else m)] + [2 for _ in range(3-p if p!=0 else 0)]
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-20 13:46:05 | 显示全部楼层
  1. def func209(num):
  2.     len=num//2
  3.     max=num
  4.     for i in range(2,len+1):
  5.         element=num//i
  6.         rest=num%i
  7.         multiple=element**(i-rest)*(element+1)**rest
  8.         if max<multiple:
  9.             max=multiple
  10.     print(max)
  11.         
  12. func209(9)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-20 13:56:38 | 显示全部楼层
  1. n = int(input())
  2. a3 = [];
  3. a2 = [];
  4. while n >= 3:
  5.     if n - 3 == 1:
  6.         break
  7.     a3.append(3)
  8.     n -= 3
  9. while n >= 2:
  10.     a2.append(2)
  11.     n -= 2
  12. x = 1;
  13. for i in a3:
  14.     x *= i
  15. for i in a2:
  16.     x *= i
  17. print(x)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-20 14:07:01 | 显示全部楼层
这是个嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-20 14:20:47 | 显示全部楼层
# 发觉3*3*3。。。积一直最大,就这样写了。。。看看别人的

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

点评

余数为1时不应该单算,应该与3合并为4  发表于 2018-9-24 20:01

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-20 16:05:56 | 显示全部楼层
还好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-20 16:32:44 | 显示全部楼层
  1. def noy(n1,n):
  2.     n1 *= 3
  3.     if n <= 7:
  4.         return n1 , n
  5.     else:
  6.         n -= 3
  7.         return n1,n

  8. def yu2(n1,n):
  9.     n1 *= 2
  10.     if n <= 6:
  11.         return n1,n
  12.     else:
  13.         n -= 2
  14.         return n1,n

  15. num = int(input('---->'))
  16. n = num
  17. n1 = 1
  18. list1 = []
  19. while True:
  20.     if n == 5:
  21.         list1.append(2)
  22.         list1.append(3)
  23.         n1 *= 2
  24.         n1 *= 3
  25.         print(list1,n1)
  26.         break
  27.     elif n == 6:
  28.         list1.append(3)
  29.         list1.append(3)
  30.         n1 *= 3
  31.         n1 *= 3
  32.         print(list1, n1)
  33.         break
  34.     elif n == 7:
  35.         list1.append(3)
  36.         list1.append(2)
  37.         list1.append(2)
  38.         print(list1,3*2*2)
  39.         break
  40.     if num <= 4 and num >= 0:
  41.         print(num)
  42.         break
  43.     if n%3 != 0 and n%2 != 0:
  44.         n1,n = noy(n1,n)
  45.         list1.append(3)
  46.     elif n%3 == 0:
  47.         n1,n = noy(n1,n)
  48.         list1.append(3)
  49.     elif n%2 == 0:
  50.         n1,n = yu2(n1,n)
  51.         list1.append(2)
复制代码


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

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-20 17:05:58 | 显示全部楼层

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

  9.         # 如果拆分数量=1,则不拆分直接保存
  10.         if i == 1 :
  11.             dict_result[number] = number
  12.         else:
  13.             # 拆分方法 如 9
  14.             # 拆分成两个数 9//2 = 4  (9-4)//1 = 5 则拆分的两个数为 4,5
  15.             # 拆分成三个数 9//3 = 3  (9-3)//2 = 3 (9-3-3)//1 = 3 则拆分的三个数为 3,3,3
  16.             while i > 0 :
  17.                 temp = num//i              
  18.                 list_result.append(temp)
  19.                 num = num - temp
  20.                 i -=1
  21.             for each in list_result:
  22.                 result *= each
  23.             dict_result[result] = list_result

  24.     return dict_result

  25. r = chaifen(number)
  26. max_key = max(r.keys())
  27. print('乘积最大数为:%d ,其拆分结果为 :' % max_key , r[max_key])
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-20 19:59:45 | 显示全部楼层
while 1:
    temp=int(input("请输入一个正整数"))
    list1=[1,2,3,4]
    if temp in list1:
        print(temp)
    else:
        a=temp/3
        b=temp%3
        if b==0:
            print(3**a)
        else:
            print(3**a*b)

点评

不该分出1来  发表于 2018-9-24 20:06

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-20 20:58:36 | 显示全部楼层
def max_product(n):
    s=[1,2,3,4]
    result=[n]
    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

点评

≤4时出错  发表于 2018-9-24 20:08

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-20 21:46:01 | 显示全部楼层
  1. def fun_209(x):
  2.     max_mul=x
  3.     for i in range(2,x//2+1):
  4.         if x%i==0:
  5.             if i**(x//i)>max_mul:
  6.                 max_mul=i**(x//i)
  7.         elif x%i==1:
  8.             if i**(x//i-1)*(1+i)>max_mul:
  9.                 max_mul=i**(x//i-1)*(1+i)
  10.         else:
  11.             if i**(x//i)*(x%i)>max_mul:
  12.                 max_mul=i**(x//i)*(x%i)
  13.     return max_mul
  14. print(fun_209(9))
  15. print(fun_209(100))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[k]
                if re > products:
                    products = re
                    max_a.append(a)
                else:
                    products = products

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

点评

测试了91和102,结果都不对。  发表于 2018-9-24 20:11

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 09:19:39 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2018-9-21 09:22 编辑

好久没来了,这题有意思
  1. dic = {1:1, 2:2, 3:3, 4:4}
  2. def calc(n):
  3.         for i in range(2,int(n/2)+1):
  4.                 j = n-i
  5.                 if j not in dic:
  6.                         dic[j] = calc(j)
  7.                 if n not in dic:
  8.                         dic[n] = dic[i]*dic[j]
  9.                 else:
  10.                         if dic[i]*dic[j]>dic[n]:
  11.                                 dic[n] = dic[i]*dic[j]
  12.         return dic[n]
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 09:41:12 | 显示全部楼层
  1. def q209(num):
  2.     if num == 1:
  3.         return 1
  4.     elif num % 3 == 0:
  5.         return 3 ** (num//3)
  6.     else:
  7.         return (3 ** (num//3 - 2 + num % 3)) * 2 * (3 - num % 3)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 10:29:11 | 显示全部楼层
本帖最后由 翩跹叶惊鸿 于 2018-9-22 20:33 编辑
  1. n = int(input('请输入一个正整数:'))

  2. def chaifen(n):
  3.     x = n//2
  4.     y = n - n//2
  5.     if x > 4:
  6.         x = chaifen(x)
  7.     if y > 4:
  8.         y = chaifen(y)
  9.     a = x * y
  10.     z = n//3
  11.     if n//3 == n/3:
  12.         if z > 4:
  13.             z = chaifen(z)
  14.         b = z**3
  15.     else:
  16.         b = 0
  17.     return max(a,b,n)

  18. 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 也欢迎指正。


点评

测试91和102都不对  发表于 2018-9-24 20:14

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 08:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表