目前,我正在学习Ruby/编程,我遇到了这样的问题:
你的任务是建造一座建筑,它将是一堆立方体。底部的多维数据集将有一个
n^3的卷,上面的多维数据集将有(n-1)^3的体积等等,直到顶部有一个1^3的卷。您将得到该建筑的总体积m。如果给了m,您能找到必须构建的多维数据集的数量n吗?函数findNb(find_nb, find-nb)的参数将是整数m,如果存在这样的n,则必须返回整数n,如n^3 + (n-1)^3 + ... + 1^3 = m;如果没有这样的n*,则返回-1。
下面是我解决这个问题的尝试:
def find_nb(m)
(1..Float::INFINITY).each do |n|
if (1..n).inject(0) {|sum, value| sum + value**3} == m
return p n
else
next
end
end
end对于我知道将起作用的输入来说,这似乎是正常的,例如:
find_nb(4183059834009)
find_nb(135440716410000)
find_nb(40539911473216)我需要帮助的领域:
n值时,如何才能理解它
find_nb(24723578342962)发布于 2016-11-29 03:49:26
提示1:您不需要进入无穷大:在某个n之后,和将大于m,并且很快就会越走越远。
提示2:如果找到n,函数将永远不会到达它的最后一行,因为有return。
提示3:如果您到达next块的末尾,那么each是自动的。
提示4:每次都不需要从头开始重新计算立方体的总和。你不是在建造一个全新的建筑,你只是在下面放一个更大的立方体。
所以..。
def find_nb(m)
n = 1
sum = 1
while sum < m
n += 1
sum += n**3
end
return sum == m ? n : -1
end编辑:这是一个功能版本,但我认为上面的普通while仍然清晰得多(而且可能也更快):
def find_nb(m)
sum = 0
sizes = 1.upto(Float::INFINITY)
.lazy
.map { |n| sum += n ** 3 }
.take_while { |x| x <= m }
.to_a
sizes.last == m ? sizes.length : -1
endhttps://stackoverflow.com/questions/40857191
复制相似问题