2017-11-11 49 views
0

所以我必须做一个代码来检查一个数字是否是一个完美的立方体,但由于某种原因,任何大于27的立方体,它说它的根是x.99999999。 (即它返回64 **(1/3)作为3.9999 & 125 **(1/3)作为4.9999)。检查一个完美的立方体

n = int(input("What number would you like to check if it is a cube?")) 

def is_cube(n): 
    guess = n**(1.0/3.0) 
    if (guess)%1 == 0: 
     print(True, "it's cubed root is", guess) 
    else: 
     print(False, "it's cubed root is", guess) 
is_cube(n) 
+1

浮点数不精确:https://docs.python.org/3/tutorial/floatingpoint.html查看使用十进制模块:https://docs.python.org/3/library/decimal.html#模块十进制 –

回答

1

只是转换为integerround和检查integercubed是否是inputn)。

def is_cube(n): 
    cube_root = n**(1./3.) 
    if round(cube_root) ** 3 == n: 
     print(True, "its cubed root is", round(cube_root)) 
    else: 
     print(False, "its cubed root is", cube_root) 

和一些测试:

>>> is_cube(12) 
False its cubed root is 2.2894284851066637 
>>> is_cube(34) 
False its cubed root is 3.239611801277483 
>>> is_cube(27) 
True its cubed root is 3 
>>> is_cube(64) 
True its cubed root is 4 

哦,顺便说一句,的its的所有格形式并不需要撇号。你的代码不对。

0

一旦开始使用浮点运算,您需要认识到无限精度不可用。通常情况下,考虑到可用于存储信息的有限位数,浮点值实际上只是最好的近似值。

对于这种特殊情况,您可能会发现您可以只取立方体根部的整数值,并检查它是否为立方体给出原始值。

像这样的东西应该是一个良好的开端:

def is_cube(n): 
    guess = n**(1.0/3.0) 
    iguess = int(guess) 
    if iguess * iguess * iguess == n: 
     print(True, "it's cubed root is", iguess) 
     return 
    iguess = iguess + 1 
    if iguess * iguess * iguess == n: 
     print(True, "it's cubed root is", iguess) 
     return 
    print(False, "it's cubed root is", guess) 
相关问题