鱼C论坛

 找回密码
 立即注册
楼主: 冬雪雪冬

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

[复制链接]
发表于 2018-6-6 23:09:59 | 显示全部楼层
本帖最后由 柯基不是天然卷 于 2018-6-6 23:11 编辑

from itertools import product  
from itertools import combinations  
import itertools  
list = [28,12,89,15,28,4,36,55]
def test_func1(num_list):  
    tmp_list = itertools.permutations(num_list)  
    global res_list
    res_list=[]
    for one in tmp_list:  
        res_list.append(one)
    print '元素不允许重复出现排列总数为:', len(res_list)
test_func1(list)
MAX = 0
MAX2 = 0
for list_one in res_list:
    a = 0
    mul = 1
    while a<=len(list)-1:
        mul = mul * (list_one[a]+list_one[a+1])
        a+=2
        MAX2 = mul
        if MAX <= MAX2:
            MAX = MAX2
print '最大的数是:',MAX

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-6-6 23:48:37 | 显示全部楼层
import random
time = 10
q = []
num = input('请输入您想输入的数组:')
num1 = num.split(',')
temp = []
for i in num1:
    if i != ',':
        temp.append(i)
print(temp)
if len(temp) % 2 == 0 :
    while time > 0 :
        random.shuffle(temp)
        w = temp
        n = len(w)
        s = 0
        while s ==len(w):
               
               sum =1
               sum1 =(int(w[s])+int(w[s+1]))
               sum = sum1 * sum
               s += 2
        q.append(sum)
        time -= 1
    print(q)
        
else:
    print('请重新输入:')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-7 04:39:58 | 显示全部楼层
一直覺得用最簡單的邏輯去排列的話會有太多重複的組合
想了好久才想到一個方法是可以直接排出所有不重複的組合
比起考代碼感覺更像是訓練數學邏輯了
  1. import copy
  2. que=[28, 12, 89, 15, 28, 4, 55 ,36]

  3. def cal(num):
  4.     max=0
  5.     for each in LI(len(num)):
  6.         result=1
  7.         for k in range(int(len(num)/2)):
  8.             result = result*(num[each[2*k]]+num[each[2*k+1]])
  9.         if result > max:
  10.             print(result,'    找到更大的')
  11.             max=result

  12. def LI(lenP):
  13.     if lenP==2:
  14.         return [[1,2]]
  15.     else:
  16.         b=[[lenP-1,lenP-2]]
  17.         return makelist(lenP,lenP,b)

  18. def makelist(lenA,lenP,b):
  19.     b2=[]
  20.     for i in b:
  21.         i.append(lenP-3)
  22.         i.append(lenP-4)
  23.     for i in range(lenA-lenP+2):
  24.         b1=copy.deepcopy(b)
  25.         for k in b1:
  26.             j=k.index(lenA-1-i)
  27.             k[-1],k[j]=k[j],k[-1]
  28.         b2=b2+b1
  29.     b2=b2+b
  30.     lenP=lenP-2
  31.     if lenP>2:
  32.         return makelist(lenA,lenP,b2)
  33.     else:
  34.         return b2

  35. cal(que)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-6-7 11:26:15 | 显示全部楼层
def a_m(list_n):
        while list_n:
                x = max(list_n)
                y = min(list_n)
                print(x,y)
                list_n.remove(x)
                list_n.remove(y)
                print(list_n)
                z = x + y
                yield z

s = 1
for i in a_m([28, 12, 89, 15, 28, 4, 36, 55]):
        s *= i
        print(s)
#有点取巧,怎么强算还没想出来,递归的话估计会很慢吧

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-6-7 15:13:19 | 显示全部楼层
list1 = [28, 12, 89, 15, 28, 4, 36, 55]
list1.sort()
list2 = []
num = 0
result = 1

for i in list1:
    num += 1
    list2.append((i, list1[-num]))
list2 = list2[:len(list2)//2]

print(list2)
for i in list2:
    result *= (i[0] + i[1])

print(result)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-6-7 19:43:34 | 显示全部楼层
这个题,个人认为与已知总和,求两个数的积的最大值一样。
就是尽量让每个和数接近。
  1. >>> def fun( _list ):
  2.         ls = sorted(_list)
  3.         n = len( ls )
  4.         s = 1
  5.         for i in range(n//2):
  6.                 s *= ls[i] + ls[n-1-i]
  7.         return s

  8. >>> fun([28, 12, 89, 15, 28, 4, 36, 55])
  9. 17795736
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-6-8 00:20:19 | 显示全部楼层
本帖最后由 the0503 于 2018-6-8 10:04 编辑

抱歉,发表后没有任何提示,以为没提交上。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-8 00:21:22 | 显示全部楼层
本帖最后由 the0503 于 2018-6-8 10:05 编辑

同上。抱歉,没找到地方删帖。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-8 00:21:58 | 显示全部楼层
自己测试没有问题
  1. a = (28, 12, 89, 15, 28, 4, 36, 55)
  2. def foo(a):
  3.         if len(a) == 2:
  4.                 list2 = []
  5.                 n = a[0]+a[1]
  6.                 list2.append(n)
  7.                 return list2
  8.         else:
  9.                 list2 = [1]*len(a)
  10.                 for i in range(1,len(a)):
  11.                         list1 = list(a)
  12.                         list2[i-1] = list1[i]+list1[0]
  13.                         del list1[i],list1[0]
  14.                         b = tuple(list1)
  15.                         list2[i-1] = max(listm(foo(b),list2[i-1]))
  16.                 return list2

  17. def listm(list1,n):
  18.         for i in range(len(list1)):
  19.                 list1[i] = list1[i]*n
  20.         return list1

  21. print(max(foo(a)))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-6-8 00:22:27 | 显示全部楼层
为什么提交不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-8 00:23:44 | 显示全部楼层
提交不了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-8 00:24:31 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-8 00:26:57 | 显示全部楼层
占坑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-8 00:29:22 | 显示全部楼层
发不了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-8 00:31:14 | 显示全部楼层
  1. # -*- coding: utf-8 -*-
  2. a = (28, 12, 89, 15, 28, 4, 36, 55)
  3. def foo(a):
  4.     if len(a) == 2:
  5.         list2 = []
  6.         n = a[0]+a[1]
  7.         list2.append(n)
  8.         return list2
  9.     else:
  10.         list2 = [1]*len(a)
  11.         for i in range(1,len(a)):
  12.             list1 = list(a)
  13.             list2[i-1] = list1[i]+list1[0]
  14.             del list1[i],list1[0]
  15.             b = tuple(list1)
  16.             list2[i-1] = max(listm(foo(b),list2[i-1]))
  17.         return list2

  18. def listm(list1,n):
  19.     for i in range(len(list1)):
  20.         list1[i] = list1[i]*n
  21.     return list1

  22. print(max(foo(a)))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-8 00:31:44 | 显示全部楼层
  1. # -*- coding: utf-8 -*-
  2. a = (28, 12, 89, 15, 28, 4, 36, 55)
  3. def foo(a):
  4.     if len(a) == 2:
  5.         list2 = []
  6.         n = a[0]+a[1]
  7.         list2.append(n)
  8.         return list2
  9.     else:
  10.         list2 = [1]*len(a)
  11.         for i in range(1,len(a)):
  12.             list1 = list(a)
  13.             list2[i-1] = list1[i]+list1[0]
  14.             del list1[i],list1[0]
  15.             b = tuple(list1)
  16.             list2[i-1] = max(listm(foo(b),list2[i-1]))
  17.         return list2

  18. def listm(list1,n):
  19.     for i in range(len(list1)):
  20.         list1[i] = list1[i]*n
  21.     return list1

  22. print(max(foo(a)))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-8 00:55:06 | 显示全部楼层
#相信用户的前提下:def list_max(*num):
    num = list(num)
    num.sort()
    i = 0
    y = 1
    while i < len(num) / 2:
        x = num + num[len(listx) - i - 1]
        y *= x
        i += 1
    return y

listx = []
num = input("请输入偶数个数字:")
num = int(num)
for i in range(num):
    num = input("请输入第"+str(i+1)+"个数字:")
    listx.append(int(num))
print("任意两个数和之积最大为",list_max(*listx))

点评

报错:TypeError: can only concatenate list (not "int") to list  发表于 2018-6-10 16:39
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-8 00:56:35 | 显示全部楼层
#相信用户的前提下:
  1. def list_max(*num):
  2.     num = list(num)
  3.     num.sort()
  4.     i = 0
  5.     y = 1
  6.     while i < len(num) / 2:
  7.         x = num[i] + num[len(listx) - i - 1]
  8.         y *= x
  9.         i += 1
  10.     return y

  11. listx = []
  12. num = input("请输入偶数个数字:")
  13. num = int(num)
  14. for i in range(num):
  15.     num = input("请输入第"+str(i+1)+"个数字:")
  16.     listx.append(int(num))
  17. print("任意两个数和之积最大为",list_max(*listx))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-6-10 10:55:08 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-10 22:22:02 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 19:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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