立方堆的体积

时间:2018-09-08 18:34:28

标签: python optimization

我正在尝试挑战。想法如下:

  

“您的任务是建造一栋将要堆放n个立方体的建筑物。   底部的立方体的体积为n ^ 3,上方的立方体将为   体积为(n-1)^ 3,依此类推,直到顶部有一个   体积为1 ^ 3。

     

给出建筑物的总体积m。被给予m可以   您找到要构建的多维数据集数量n?如果没有这样的n   存在返回-1“

我显然看到了:

2 ³+ 1 = 9 =3²和3-1 = 2

3 ³+2³+ 1 = 36 =6²和6-3 = 3

4 ³+3³+2³+ 1 = 100 =10²和10-6 = 4

5 ³+4³+3³+2³+ 1 = 225 =15²和15-10 = 5

6 ³+5³+4³+3³+2³+1 = 441 =21²和21-15 = 6

因此,如果我认为,如果我检查确定某个数字是平方根,那么我已经可以排除一些。然后,我可以在变量1处从平方根取那个值(递增)。这些值最终将匹配,或者以前的平方根将变为负。

所以我写了这段代码:

def find_nb(m):
    x = m**0.5
    if (x%1==0):
        c = 1
        while (x != c and x > 0):
            x = x - c
            c = c + 1

        if (x == c):
            return c
        else:
            return -1
    return -1

这行不行吗?我想念什么? 我无法通过示例集的三分之一:10170290665425347857应该为-1,并且在我的程序中为79863。

我缺少明显的东西吗?

4 个答案:

答案 0 :(得分:3)

您遇到了浮点精度问题。即,我们有

<div class="col-md-6">
    <h4>Top 10 Categories</h4>
    {!! $chartCategories->render() !!}
  </div>

因此,即使实际上不是正方形,也会采用内部分支:

	<table border="1" width="100%">
		<thead></thead>
		<tbody>
			<tr>
				<td>1</td>
				<td rowspan="4">2</td>
				<td>3</td>
			</tr>
			<tr>
				<td rowspawn="2">4</td>
				<td rowspawn="2">5</td>
			</tr> 
			<tr>
				<td>6</td>
				<td>7</td>
			</tr>
		</tbody>
	</table>

如果您从this question借用了许多整数平方根选项之一,并验证了sqrt squared给出了原始数字,那么您应该对算法没问题,至少在我没有忽略某些极端情况的情况下

(在旁边:您已经注意到了关键模式。数字1、3、6、10、15 ..非常有名,并且有自己的公式,可用来解决是否存在这样的问题。一个直接起作用的数字。)

答案 1 :(得分:1)

DSM的答案是一个,但是要加上我的两分钱来改善解决方案...

Brilliant.org中的此表达式用于求和多维数据集数字:

sum of k**3 from k=1 to n:
    n**2 * (n+1)**2 / 4

这当然可以解决所涉及的总量。这是四个解决方案之一(要求n和v均为正):

from math import sqrt

def n(v):
    return 1/2*(sqrt(8*sqrt(v) + 1) - 1)

但是此函数还返回79863.0。现在,如果我们将1到n的所有多维数据集求和,由于精度误差,我们得到的结果会稍有不同:

v = 10170290665425347857
cubes = n(v)    # 79863
x = sum([i**3 for i in range(cubes+1)])

# x = 10170290665425347857, original
x  -> 10170290665425347856

答案 2 :(得分:0)

我不知道您的答案是否正确,但是对于这个问题,我还有另一种解决方法,

def max_level(remain_volume, currLevel):
    if remain_volume < currLevel ** 3:
        return -1
    if remain_volume == currLevel ** 3:
        return currLevel
    return max_level(remain_volume - currLevel**3, currLevel + 1)

然后您用max_level(m, 0)找出答案。这需要O(n)时间和O(1)内存。

答案 3 :(得分:0)

根据我的要求,我在 PHP 中找到了一个简单的解决方案。

 Object.defineProperty(obj, "name", {
        value: "karl",
        writable: false
    });

}