鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 冬雪雪冬

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

[复制链接]
发表于 2018-9-21 11:37:06 | 显示全部楼层
  1. def findx(n):
  2.     result=[]
  3.     if n <= 4:
  4.         result.append(n)
  5.     elif n==6:
  6.         result.extend([3,3])
  7.     else:
  8.         for i in range(2,9):
  9.             if n%i==0 and n!=i:
  10.                 a=n//i
  11.                 if a>i and i != 2:
  12.                     for j in range(a):
  13.                         result.append(i)
  14.                 else:
  15.                     for j in range(i):
  16.                         result.append(a)
  17.                 break
  18.         else:
  19.             result.extend([n//2,n-n//2])
  20.     return result

  21. def a209(n):   
  22.     result=[]
  23.     a=findx(n)
  24.     while result != a:
  25.         result=a[:]
  26.         a=[]
  27.         for i in result:
  28.             b=findx(i)
  29.             a.extend(b)
  30.     return result

  31. n=int(input('请输入一个正整数:'))
  32. result=a209(n)
  33. s=1
  34. s1=''
  35. for i in result:
  36.     s=s*i
  37. s1='*'.join(str(i)for i in result)
  38. print(s1,'=',s)
复制代码

点评

测试91结果不对  发表于 2018-9-24 20:16

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-21 14:15:41 | 显示全部楼层
  1. from functools import reduce

  2. def fun209(n):
  3.     if n in (1, 2, 3, 4):
  4.         return n
  5.     k, r = divmod(n, 3)
  6.     if r == 0:
  7.         split_list = [3] * k
  8.     elif r == 1:
  9.         split_list = [4] + [3] * (k - 1)
  10.     else:
  11.         split_list = [3] * k + [2]
  12.     return "最大乘积是%d,使得乘积最大的拆分为:%s" % (reduce(lambda x, y: x * y, split_list), split_list)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-21 15:06:55 | 显示全部楼层
  1. def f209(n):
  2.     result,c=n,n
  3.     if n:
  4.         from math import sqrt
  5.         re=sqrt(n)
  6.         if re==int(re):
  7.             if re**re>n:
  8.                 result,c=re**re,re
  9.         else:
  10.             for i in range(1,n+1):
  11.                 pd=i**(n//i)*(n%i) or i**(n//i)
  12.                 if pd>result:
  13.                     result,c=pd,i
  14.     return '%s的最大乘积是%d:%d'%(n,c,result)
  15. for i in range(1,20):
  16.     print(f209(i))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 17:26:16 | 显示全部楼层
  1. def func209(nums):
  2.     if nums <= 4:
  3.         return nums
  4.     elif nums == 5:
  5.         return '3 * 2'
  6.     if nums % 3 == 0:
  7.         return('3 * '* (nums // 3 - 1) + '3')
  8.     else:
  9.         return('3 * ' * (nums // 3 - 1) + str(3 + nums % 3))

  10. print(func209(32))
  11. print(func209(5))
  12. print(func209(7))
复制代码

不知道对不对,就是尽量把数字拆分成3的次方。

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-21 20:25:18 | 显示全部楼层
  1. def max_product(n):
  2.         i, j = divmod(n, 3)
  3.         if j == 0:
  4.                 return 3**i
  5.         elif j == 1:
  6.                 return 3**(i-1)*4
  7.         else:
  8.                 return 3**i*2

  9. print(max_product(9))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-23 23:42:55 | 显示全部楼层
  1. from functools import reduce
  2. from operator import mul
  3. def find_max_split_product(num):
  4.     product = num
  5.     result = [num]
  6.     split_times = 2
  7.     while True:
  8.         split_num_list = [num // split_times for i in range(split_times)]
  9.         less_value = num - sum(split_num_list)
  10.         if less_value > 0:
  11.             for i in range(less_value):
  12.                 split_num_list[i] += 1
  13.         split_num_profuct = reduce(mul, split_num_list, 1)
  14.         if split_num_profuct > product:
  15.             split_times += 1
  16.             product = split_num_profuct
  17.             result = split_num_list
  18.         else:
  19.             return product, result
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-24 00:02:49 | 显示全部楼层
改进版,根据经验,最大乘积一般出现在划分次数为该数的三分之一处
  1. from functools import reduce
  2. from operator import mul
  3. from time import perf_counter
  4. def find_max_split_product(num, split_times):
  5.     split_num_list = [num // split_times for i in range(split_times)]
  6.     less_value = num - sum(split_num_list)
  7.     if less_value > 0:
  8.         for i in range(less_value):
  9.             split_num_list[i] += 1
  10.     split_num_profuct = reduce(mul, split_num_list, 1)
  11.     return split_num_profuct


  12. def main():
  13.     start = perf_counter()
  14.     num = 7960
  15.     split_times = num // 3 + 1

  16.     while True:
  17.         max_product = find_max_split_product(num, split_times)
  18.         less_time_split_product = find_max_split_product(num, split_times-1)
  19.         more_time_split_product = find_max_split_product(num, split_times+1)
  20.         if less_time_split_product > max_product:
  21.             split_times -= 1
  22.         elif more_time_split_product > max_product:
  23.             split_times += 1
  24.         else:
  25.             break
  26.     stop = perf_counter()
  27.     print("max_product:%d" % max_product)
  28.     print("time used:", stop - start)
  29. if __name__ == '__main__':
  30.     main()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)))

第一次答题,有点紧张

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-25 13:56:37 | 显示全部楼层
  1. # 思路,生成1~n的最大数列,比较这n个最大数列哪个最大即可
  2. def p209(n = 10):
  3.     a = {}
  4.     for j in range(1,n+1):
  5.         b = []
  6.         reminder = n%j
  7.         for i in range(1,j+1):
  8.             b.append(n//j)
  9.         k = 0
  10.         while reminder>0:
  11.             b[k] = b[k] +1
  12.             reminder -= 1
  13.             k += 1
  14.         a[j] = b
  15.     # 这样就形成了n个小型矩阵,比较他们的乘积便可以了
  16.     max_value = []
  17.     max_dict = {}
  18.     for p in range(n):
  19.         product = 1
  20.         for every in a[p+1]:
  21.             product *= every
  22.         max_value.append(product)
  23.         max_dict[product] = a[p+1]
  24.     # 比较输出最大的max_value
  25.     print(max_dict[max(max_value)])
  26. p209(10)
  27.          
复制代码

这是我的理解,10最后结果是3,3,2,2,不知道对不
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-27 09:39:19 | 显示全部楼层
  1. def fun209(x):
  2.     if x%3 == 0:
  3.         return [3 for i in range(x//3)]
  4.     elif x%3 == 1:
  5.         return [3 for i in range((x-4)//3)] + [2,2]
  6.     elif x%3 == 2:
  7.         return [3 for i in range(x//3)] + [2]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-11 14:21:11 | 显示全部楼层
  1. # -*- coding: utf-8 -*-
  2. n = int(input("请输入一个数字"))
  3. if n % 2 == 0:
  4.     div = n / 2
  5.     mul = div ** 2
  6.     print("%d 拆分后的最大值是%d" %(n ,mul))
  7. else:
  8.     div1 = n // 2
  9.     mul = (div1+1)*(div1-1)
  10.     print("%d 拆分后的最大值是%d" % (n, mul))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-16 15:22:07 | 显示全部楼层
本帖最后由 喜欢吃菠菜 于 2018-10-16 15:40 编辑

def divtocols(num,col,tmp,index,res):
    """
       参数说明:num是要分解的整数,col要分解成的列数,比如5分成[1,4][2,3]就是2列,临时列表tmp格式:[]*col,res要返回的结果
       思路:分解一个数最终就是化解成一个数分成2个整数,
       比如5要分成3列数,先分[1,4][2,3]...,再剥第二列4,3分成两列[1,[1,3]],[1,[2,2]],[2,[1,2]],以此类推
    """
    if num==1 or col==1:
        res.append(num)
        return
    if num==col:
        res.extend([1]*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[index]=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=[0]*col
        divtocols(num,col,tmp,0,arr)
        res.append(arr[:])
    return res

res=splitnum(6)
for l in res:
    print(l)
结果:
[6]
[[1, 5], [2, 4], [3, 3]]
[[1, 1, 4], [1, 2, 3], [2, 1, 3], [2, 2, 2]]
[[1, 1, 1, 3], [1, 1, 2, 2]]
[[1, 1, 1, 1, 2]]
[1, 1, 1, 1, 1, 1]

#分解的问题解决了,剩下的计算乘积等问题,就不是问题了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-25 22:33:33 | 显示全部楼层
本帖最后由 xy123151 于 2018-11-25 22:36 编辑

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

使用道具 举报

发表于 2019-1-10 16:48:43 | 显示全部楼层
  1. num=input("请输入一个正整数:")
  2. n=num//3
  3. a=num%3
  4. mylist=[]
  5. result=0
  6. if a==1:
  7.         for i in range (n-1):
  8.                 mylist.append(3)
  9.         if n>1:
  10.                 mylist.extend([2,2])
  11.                 result=3**(n-1)*4
  12.         elif n==1:
  13.                 mylist.append(4)
  14.                 result=4
  15.         else:
  16.                 mylist.append(1)
  17.                 result=1
  18. else:
  19.         for i in range (n):
  20.                 mylist.append(3)
  21.         result=3**n
  22.         if a==2:
  23.                 mylist.append(2)
  24.                 result=3**n*2
  25. print('将%d拆分成:' %num,mylist,',乘积计算值最大为%d' %result)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 01:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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