Python:每日一题 325
本帖最后由 fan1993423 于 2020-2-6 22:21 编辑接昨天康康的题目,改良一下。
是一个正数n(可以是整数,可以是小数),拆分成两个及其以上的正数(可整数可小数),求最大值?
(保留两位小数即可)!
欢迎大家来答题 本帖最后由 TJBEST 于 2020-2-6 22:44 编辑
这题我就不写程序了,我把解题过程写在下面大家看看,完整的数学求解。觉得好的点个赞{:5_109:}
支持楼主{:10_256:}
不过楼主能给几个测试用例嘛 zltzlt 发表于 2020-2-6 13:08
支持楼主
不过楼主能给几个测试用例嘛
我也不确定最后答案是什么,希望大佬能给出答案,如果有详细的数学推理过程还可以追加鱼币奖励 zltzlt 发表于 2020-2-6 13:08
支持楼主
不过楼主能给几个测试用例嘛
帮我高亮显示吧 本帖最后由 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))
稍作修改,仅仅猜测
fan1993423 发表于 2020-2-6 14:34
帮我高亮显示吧
给几个测试用例。
输入:xxx
输出:xxx
解释:xxx(可选) 本帖最后由 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)) 楼主,加一个条件吧,拆成若干个正数之和,,不然1=-2+-2+5,这样的下去就无解了 本帖最后由 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时开始体现)与题意就有了出入,当成特例处理一下就行
权限不够,不好上传图片,手打可累了
1可以拆分成正无穷大+负无穷小 本帖最后由 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 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 根据均值定理:a+b/2 >= sqrt(ab) 这个sqrt相当于根号,两边相等当且仅当 a == b
又因为取得最大值可以分解为小数,那么e就是最合适的,所以给定任意一个数,分解的数字的平均值越接近 e 乘积的结果也就最大
例如 5 最大值就是6.25 也就是平分,而其他的数字,应该分成尽量多的e,若余下的数字为 n,e 有 x 个 ,那么分割的数字就是 e + n/x
不知道解释的完不完整,大家有新的想法,可以回复哦,一起探讨一下,嘿嘿,
我说完这些,其实代码也就出来了,嘿嘿 wp231957 发表于 2020-2-6 16:53
1可以拆分成正无穷大+负无穷小
不能,无穷大不能计算,负无穷小是-0.000000000000000000000000000(此处省略无数个0)1 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更大 ouyunfu 发表于 2020-2-6 14:50
import math
def func325(n):
m=round(n/math.e,0)
m<=2的原理是什么? 题目已改成正数 kinkon 发表于 2020-2-6 17:11
sum是内置函数,最好别这样用,另外t/1000,比方说n=10,按照你这个方法,会循环9998次,应该速度不快,这道题不需要循环吧 William4869 发表于 2020-2-6 14:54
楼主,加一个条件吧,拆成若干个正数之和,,不然1=-2+-2+5,这样的下去就无解了
已改