Python 立方桩体积

Python 立方桩体积,python,optimization,Python,Optimization,我在尝试挑战。其思路如下: “你的任务是建造一座由n个立方体组成的建筑。 底部的立方体体积为n^3,上面的立方体体积为 体积为(n-1)^3,依此类推,直到顶部有一个 体积为1^3 给你建筑物的总体积m,给你m可以 您可以找到必须构建的多维数据集的数量n?如果没有,则为n 存在返回-1“ 我显然看到了: 23+1=9=3²和3-1=2 33+2³+1=36=6²和6-3=3 43+3+2+1=100=10²和10-6=4 53+4+3+2+1=225=15²和15-10=5 63+5+4+3+2

我在尝试挑战。其思路如下:

“你的任务是建造一座由n个立方体组成的建筑。 底部的立方体体积为n^3,上面的立方体体积为 体积为(n-1)^3,依此类推,直到顶部有一个 体积为1^3

给你建筑物的总体积m,给你m可以 您可以找到必须构建的多维数据集的数量n?如果没有,则为n 存在返回-1“

我显然看到了:

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

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

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

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

63+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


我遗漏了一些明显的东西吗?

我不知道你的答案是否正确,但我有另一个解决这个问题的方法,它更简单

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)
def最大液位(剩余体积、当前液位):
如果剩余容量

您可以通过
max_level(m,0)
找到答案。这需要O(n)个时间和O(1)个内存。

我不知道你的答案是否正确,但我有另一个解决这个问题的方法,它更容易

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)
def最大液位(剩余体积、当前液位):
如果剩余容量

您可以通过
max_level(m,0)
找到答案。它需要O(n)个时间和O(1)个内存。

您遇到了浮点精度问题。也就是说,我们有

In [101]: (10170290665425347857)**0.5
Out[101]: 3189089316.0

In [102]: ((10170290665425347857)**0.5) % 1
Out[102]: 0.0
所以取了内枝,即使它不是正方形:

In [103]: int((10170290665425347857)**0.5)**2
Out[103]: 10170290665425347856
如果您借用了许多整数平方根选项中的一个,并验证sqrt squared给出了原始数字,您应该对您的算法感到满意,至少如果我没有忽略某些角情况的话


(旁白:你已经注意到了临界模式。数字1、3、6、10、15……非常有名,并且有自己的公式,你可以用它来解决是否有这样一个数字可以直接工作。)

你遇到了一个浮点精度问题。也就是说,我们有

In [101]: (10170290665425347857)**0.5
Out[101]: 3189089316.0

In [102]: ((10170290665425347857)**0.5) % 1
Out[102]: 0.0
所以取了内枝,即使它不是正方形:

In [103]: int((10170290665425347857)**0.5)**2
Out[103]: 10170290665425347856
如果您借用了许多整数平方根选项中的一个,并验证sqrt squared给出了原始数字,您应该对您的算法感到满意,至少如果我没有忽略某些角情况的话

(旁白:你已经注意到了临界模式。数字1,3,6,10,15..非常有名,并且有自己的公式,你可以用它来解决是否有这样一个数字可以直接工作。)

的答案是一,但再加上我的两分钱来改进解决方案

此表达式用于对多维数据集数求和:

sum of k**3 from k=1 to n:
    n**2 * (n+1)**2 / 4
这当然可以解决总体积的问题。这是四种解决方案之一(要求n和v均为正值):

但此函数也返回
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
的答案是一个,但要加上我的两分钱来改进解决方案

此表达式用于对多维数据集数求和:

sum of k**3 from k=1 to n:
    n**2 * (n+1)**2 / 4
这当然可以解决总体积的问题。这是四种解决方案之一(要求n和v均为正值):

但此函数也返回
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

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

function findNb($m) {
$total = 0; 
$n = 0;
while($total < $m)
{
      $n += 1;
      $total += $n ** 3;
  
}
return $total === $m ? $n : -1;
函数findNb($m){
$total=0;
$n=0;
而(总额<百万美元)
{
$n+=1;
$total+=$n**3;
}
返回$total===$m?$n:-1;

}

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

function findNb($m) {
$total = 0; 
$n = 0;
while($total < $m)
{
      $n += 1;
      $total += $n ** 3;
  
}
return $total === $m ? $n : -1;
函数findNb($m){
$total=0;
$n=0;
而(总额<百万美元)
{
$n+=1;
$total+=$n**3;
}
返回$total===$m?$n:-1;

}

10170290665425347857
上尝试此解决方案时会发生什么情况(OP必须处理的值之一)?在
10170290665425347857
上尝试此解决方案时会发生什么情况(OP必须处理的值之一)?