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

def cal(num):
    max=0
    for each in LI(len(num)):
        result=1
        for k in range(int(len(num)/2)):
            result = result*(num[each[2*k]]+num[each[2*k+1]])
        if result > max:
            print(result,'    找到更大的')
            max=result

def LI(lenP):
    if lenP==2:
        return [[1,2]]
    else:
        b=[[lenP-1,lenP-2]]
        return makelist(lenP,lenP,b)

def makelist(lenA,lenP,b):
    b2=[]
    for i in b:
        i.append(lenP-3)
        i.append(lenP-4)
    for i in range(lenA-lenP+2):
        b1=copy.deepcopy(b)
        for k in b1:
            j=k.index(lenA-1-i)
            k[-1],k[j]=k[j],k[-1]
        b2=b2+b1
    b2=b2+b
    lenP=lenP-2
    if lenP>2:
        return makelist(lenA,lenP,b2)
    else:
        return b2

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

>>> fun([28, 12, 89, 15, 28, 4, 36, 55])
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 | 显示全部楼层
自己测试没有问题
a = (28, 12, 89, 15, 28, 4, 36, 55)
def foo(a):
        if len(a) == 2:
                list2 = []
                n = a[0]+a[1]
                list2.append(n)
                return list2
        else:
                list2 = [1]*len(a)
                for i in range(1,len(a)):
                        list1 = list(a)
                        list2[i-1] = list1[i]+list1[0]
                        del list1[i],list1[0]
                        b = tuple(list1)
                        list2[i-1] = max(listm(foo(b),list2[i-1]))
                return list2

def listm(list1,n):
        for i in range(len(list1)):
                list1[i] = list1[i]*n
        return list1

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 | 显示全部楼层
# -*- coding: utf-8 -*- 
a = (28, 12, 89, 15, 28, 4, 36, 55)
def foo(a):
    if len(a) == 2:
        list2 = []
        n = a[0]+a[1]
        list2.append(n)
        return list2
    else:
        list2 = [1]*len(a)
        for i in range(1,len(a)):
            list1 = list(a)
            list2[i-1] = list1[i]+list1[0]
            del list1[i],list1[0]
            b = tuple(list1)
            list2[i-1] = max(listm(foo(b),list2[i-1]))
        return list2
 
def listm(list1,n):
    for i in range(len(list1)):
        list1[i] = list1[i]*n
    return list1
 
print(max(foo(a)))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-8 00:31:44 | 显示全部楼层
# -*- coding: utf-8 -*- 
a = (28, 12, 89, 15, 28, 4, 36, 55)
def foo(a):
    if len(a) == 2:
        list2 = []
        n = a[0]+a[1]
        list2.append(n)
        return list2
    else:
        list2 = [1]*len(a)
        for i in range(1,len(a)):
            list1 = list(a)
            list2[i-1] = list1[i]+list1[0]
            del list1[i],list1[0]
            b = tuple(list1)
            list2[i-1] = max(listm(foo(b),list2[i-1]))
        return list2
 
def listm(list1,n):
    for i in range(len(list1)):
        list1[i] = list1[i]*n
    return list1
 
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[i] + 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 | 显示全部楼层
#相信用户的前提下:
def list_max(*num):
    num = list(num)
    num.sort()
    i = 0
    y = 1
    while i < len(num) / 2:
        x = num[i] + 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))

评分

参与人数 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, 2025-1-17 21:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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