fan1993423 发表于 2020-2-6 11:57:46

Python:每日一题 325

本帖最后由 fan1993423 于 2020-2-6 22:21 编辑

接昨天康康的题目,改良一下。
是一个正数n(可以是整数,可以是小数),拆分成两个及其以上的正数(可整数可小数),求最大值?
(保留两位小数即可)!

欢迎大家来答题

TJBEST 发表于 2020-2-6 11:57:47

本帖最后由 TJBEST 于 2020-2-6 22:44 编辑

这题我就不写程序了,我把解题过程写在下面大家看看,完整的数学求解。觉得好的点个赞{:5_109:}

zltzlt 发表于 2020-2-6 13:08:27

支持楼主{:10_256:}

不过楼主能给几个测试用例嘛

fan1993423 发表于 2020-2-6 14:33:45

zltzlt 发表于 2020-2-6 13:08
支持楼主

不过楼主能给几个测试用例嘛

我也不确定最后答案是什么,希望大佬能给出答案,如果有详细的数学推理过程还可以追加鱼币奖励

fan1993423 发表于 2020-2-6 14:34:31

zltzlt 发表于 2020-2-6 13:08
支持楼主

不过楼主能给几个测试用例嘛

帮我高亮显示吧

William4869 发表于 2020-2-6 14:34:48

本帖最后由 William4869 于 2020-2-6 15:14 编辑

def f325(x):
    if x<4:
      return (x/2)*(x/2)
    e=2.718281828459045
    num=x//e
    if pow(x/num,num)>pow(x/(num+1),num+1):
      return pow(x/num,num)
    else:
      return pow(x/(num+1),num+1)

print(f325(0.5))



稍作修改,仅仅猜测

zltzlt 发表于 2020-2-6 14:35:27

fan1993423 发表于 2020-2-6 14:34
帮我高亮显示吧

给几个测试用例。

输入:xxx
输出:xxx
解释:xxx(可选)

ouyunfu 发表于 2020-2-6 14:50:55

本帖最后由 ouyunfu 于 2020-2-6 17:36 编辑

import math
def func325(n):
    m=round(n/math.e,0)
    return '%.2f' % (n/2.0)**2 if m<=2 else '%.2f' % (n/m)**m
print(func325(10))

William4869 发表于 2020-2-6 14:54:05

楼主,加一个条件吧,拆成若干个正数之和,,不然1=-2+-2+5,这样的下去就无解了

William4869 发表于 2020-2-6 16:46:39

本帖最后由 William4869 于 2020-2-6 23:38 编辑

证明:
已知对任意X,分成给定K个数之和求乘积,当且仅当取N等分时乘积最大(平均值不等式)
x1x2x3....xK<((x1+x2+x3...+xK)/K)^K

所以最佳拆法分必然是等分

于是题目转换成,给定X
求f(n)=(X/n)^n的最大值

取对数求导d(lnf(n))/dn=lnX-lnn-1=ln(x/ne)

所以当n取x/e时f(n)最大,且向两边递减
又n只能取整数
所以n=x/e向上或向下取整即为所求

而当x<2e时,上述可能不适用
因为此时x/e向下或向上取整,可能不拆分变成1*x最大(在x<4时开始体现)与题意就有了出入,当成特例处理一下就行

权限不够,不好上传图片,手打可累了

wp231957 发表于 2020-2-6 16:53:14

1可以拆分成正无穷大+负无穷小

kinkon 发表于 2020-2-6 17:11:52

本帖最后由 kinkon 于 2020-2-6 23:48 编辑

def f325(n):
    t,num=2,0
    while t/1000<=n:
      num=max(num,((n/t)**t))
      t+=1
    return round(num,2)

kinkon 发表于 2020-2-6 19:53:53

本帖最后由 kinkon 于 2020-2-6 23:47 编辑

酱紫应该会快点
def f325(n):
    t,num=2,0
    while t/1000<=n:
      s=round((n/t)**t,2)
      if s<num:break
      else:
            sum=s
            t+=1
    return num

wanting-for 发表于 2020-2-6 19:56:04

根据均值定理:a+b/2 >= sqrt(ab) 这个sqrt相当于根号,两边相等当且仅当 a == b
又因为取得最大值可以分解为小数,那么e就是最合适的,所以给定任意一个数,分解的数字的平均值越接近 e 乘积的结果也就最大
例如 5 最大值就是6.25 也就是平分,而其他的数字,应该分成尽量多的e,若余下的数字为 n,e 有 x 个 ,那么分割的数字就是 e + n/x
不知道解释的完不完整,大家有新的想法,可以回复哦,一起探讨一下,嘿嘿,
我说完这些,其实代码也就出来了,嘿嘿

小甲鱼de粉丝 发表于 2020-2-6 21:57:20

wp231957 发表于 2020-2-6 16:53
1可以拆分成正无穷大+负无穷小

不能,无穷大不能计算,负无穷小是-0.000000000000000000000000000(此处省略无数个0)1

fan1993423 发表于 2020-2-6 22:20:32

William4869 发表于 2020-2-6 16:46
证明:
已知对任意X,分成给定K个数之和求乘积,当且仅当取N等分时乘积最大(平均值不等式)
x1x2x3....xK

对,我之前就想到了,我就是想一个划分点的问题,因为一阶导数是(x/n)**n*(ln(x/n)-1),由于指数函数肯定为正,于是就是ln((x/n)-1),显然n<x/e时单增,n=x/e极大,n>x/e单减,二阶导数为-1/n小于0,也提示一阶导数的值为极大值。但是全局没有第二个极值点,所以极值点就是最值点。但是你说x/e**2不适用,比如9大于e**2,9/e=3.3,向下取整为3,分成e,e,9-2e反而没有3,3,3更大

fan1993423 发表于 2020-2-6 22:21:03

ouyunfu 发表于 2020-2-6 14:50
import math
def func325(n):
    m=round(n/math.e,0)


m<=2的原理是什么?

fan1993423 发表于 2020-2-6 22:22:07

题目已改成正数

fan1993423 发表于 2020-2-6 22:26:01

kinkon 发表于 2020-2-6 17:11


sum是内置函数,最好别这样用,另外t/1000,比方说n=10,按照你这个方法,会循环9998次,应该速度不快,这道题不需要循环吧

fan1993423 发表于 2020-2-6 22:26:57

William4869 发表于 2020-2-6 14:54
楼主,加一个条件吧,拆成若干个正数之和,,不然1=-2+-2+5,这样的下去就无解了

已改
页: [1] 2 3
查看完整版本: Python:每日一题 325