创建一个程序,返回超过非负整数n的最小立方体

时间:2016-12-06 00:41:14

标签: python python-3.x floating-point

所以我试图创建一个生成大于整数n的最小立方体的程序。

def first_cube_above(n):
    #Return the smallest cube which exceeds the non-negative integer n.

    num = 1
    total = 0

    while total != 1:
        if pow(int(pow(n+num, 1/3)), 3) == n + num:
            total = 1
        else:
            num += 1

    print(n + num)

这似乎适用于小整数,但我无法弄清楚为什么不能为其他人工作。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

正如@ martin.macko指出的那样,你(错误地)假设pow(pow(x, 1/3), 3) == x。由于浮点错误,这不成立。事实上,运行快速检查我们发现(可能)只有少数整数,其中上述情况属实:

good = [x for x in range(10**7) if pow(pow(x, 1/3), 3) == x]
good_cubes = [x**3 for x in range(1000) if pow(pow(x**3, 1/3), 3) == x**3]
# len(good) = 50

在我的机器上,good数字

0, 1, 2, 6, 8, 9, 12, 16, 19, 23, 25, 27, 35, 44, 65, 66, 72, 73, 76, 83, 85, 91, 94, 96, 117, 127, 130, 139, 142, 147, 158, 170, 175, 513, 514, 520, 539, 547, 549, 551, 553, 562, 563, 576, 581, 601, 605, 663, 690, 699

good_cubes

0, 1, 8, 27

您可以看到列表中最大的完美立方体是27,因此您的错误。您可以尝试如下计算下一个最大的多维数据集: next_cube = ceil(x**(1/3))**3其中ceilmath模块中的函数。

答案 1 :(得分:-1)

您的探测器有浮点数的舍入错误。与浮点数的平等比较==并不准确。更好地使用精确的arithemitcs。

最简单的解决方案是从1开始迭代并在第一个立方体上停止,然后是n:

a = 1
while a ** 3 <= n:
    a += 1
print(a ** 3)

然而,由于您需要迭代O(n ^(1/3))数字,因此此解决方案非常缺乏。但我们知道,我们确实不需要迭代非常低的数字,所以让我们从一些肯定低于根但不多的数字开始:

def cube(n):
    a = math.floor(pow(n, 1/3))
    while a ** 3 <= n:
        a += 1
    print(a ** 3)

该功能也适用于大量数字。例如:cube(9085409385209438540928540295843025325)打印9085409385221751364051702949589465608,这是2086643068802

的多维数据集