私は整数である最大の立方根を見つけようとしています、それは12,000未満です。
processing = True
n = 12000
while processing:
n -= 1
if n ** (1/3) == #checks to see if this has decimals or not
整数かどうかを確認する方法がわかりません。私はそれを文字列に変換し、それからインデックスを使って終了値をチェックし、それらがゼロかどうかを確かめることができますが、それはかなり面倒です。もっと簡単な方法はありますか?
Float値が整数かどうかを調べるには、 float.is_integer()
メソッド を使用します。
>>> (1.0).is_integer()
True
>>> (1.555).is_integer()
False
このメソッドはPython 2.6でfloat
型に追加されました。
Python 2では、1/3
は0
(整数オペランドのフロア分割!)であり、浮動小数点演算は不正確である可能性があることを考慮してください(float
は2進小数を使用する近似です、not正確な実数)しかし、ループを少し調整すると、次のようになります。
>>> for n in range(12000, -1, -1):
... if (n ** (1.0/3)).is_integer():
... print n
...
27
8
1
0
これは、前述の不正確さのために、3キューブ以上のもの(10648を含む)が見逃されたことを意味します。
>>> (4**3) ** (1.0/3)
3.9999999999999996
>>> 10648 ** (1.0/3)
21.999999999999996
代わりに整数を整数全体に近いチェックする必要があります。そうでない場合は、float()
を使用して番号を見つける必要はありません。 12000
の立方根を切り捨てるのと同じです。
>>> int(12000 ** (1.0/3))
22
>>> 22 ** 3
10648
Python 3.5以降を使用している場合は、 math.isclose()
関数 を使用して、浮動小数点値が設定可能なマージン内にあるかどうかを確認できます。
>>> from math import isclose
>>> isclose((4**3) ** (1.0/3), 4)
True
>>> isclose(10648 ** (1.0/3), 22)
True
古いバージョンでは、その関数の単純な実装(エラーチェックをスキップし、無限大とNaNを無視する) PEP485で述べられているように :
def isclose(a, b, rel_tol=1e-9, abs_tol=0.0):
return abs(a - b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
モジュロ(%)演算子を使用できます。これは、xをyで割ったときに残っている余りの数を示します - x % y
として表します。整数はすべて1で除算しなければならないため、余りがある場合は整数にしないでください。
この関数は、True
が整数かどうかに応じて、ブール値False
またはn
を返します。
def is_whole(n):
return n % 1 == 0
あなたはこれを使用することができます:
if k == int(k):
print(str(k) + " is a whole number!")
あなたはループしたり何かをチェックする必要はありません。ちょうど12000の立方根を取り、それを切り捨てます。
r = int(12000**(1/3.0))
print r*r*r # 10648
そのためには モジュロ 演算を使用できます。
if (n ** (1.0/3)) % 1 != 0:
print("We have a decimal number here!")
立方根をテストするほうが簡単ではないでしょうか。 20(20 ** 3 = 8000)から始めて30(30 ** 3 = 27000)まで上がります。それからあなたは10未満の整数をテストしなければなりません。
for i in range(20, 30):
print("Trying {0}".format(i))
if i ** 3 > 12000:
print("Maximum integral cube root less than 12000: {0}".format(i - 1))
break
上記の答えは多くの場合にうまくいきますが、いくつか見逃しています。次の点を考慮してください。
fl = sum([0.1]*10) # this is 0.9999999999999999, but we want to say it IS an int
ベンチマークとしてこれを使用して、他の提案のいくつかは私達が望むかもしれない行動を得ません:
fl.is_integer() # False
fl % 1 == 0 # False
代わりに試してみてください。
def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
def is_integer(fl):
return isclose(fl, round(fl))
今我々は得ます:
is_integer(fl) # True
isclose
には Python 3.5 + が付属しています。他のPythonでは、これとほぼ同等の定義を使用できます(対応する PEP を参照)。
どうですか?
if x%1==0:
print "is integer"
ちょっとした補足情報、is_integer
は内部的にやっていることです。
import math
isInteger = (math.floor(x) == x)
厳密にはpythonではなく、cpythonの実装は上記のように実装されています。
値を計算するには、 round
関数を使用できます。
私たちが立方根の値を計算するときに多くの人が指摘したように、Pythonではそうです、それはあなたに少しのエラーであなたに出力を与えるでしょう。値が整数かどうかを確認するには、次の関数を使います。
def cube_integer(n):
if round(n**(1.0/3.0))**3 == n:
return True
return False
しかし、 int(n)
は math.floor
と等価です。 345ではなく344になるint(41063625**(1.0/3.0))
を見つけてください。
そのため、キューブルートでint
を使用するときは注意してください。
あなたの質問に答えてください。他に質問がある場合は、 私に連絡してください 。