2017-12-31 81 views
3

数字がの場合、a > 0と一部の場合はx > 1の場合は、N = a^xとなります。我々は両側と式ログ取ることができ、これを確認するために今整数が電力形式で表現されている

Nのように表すことができるxパワーにその数以上の整数としてxを与える任意の数が存在する場合(2,sqrt(n))から反復によってそうlog(n)/log(a)=xなります。続き

は同じ

from math import log,sqrt,floor 
n=int(input()) 
t=floor(sqrt(n))+1 
flag=False 


for i in range(2,t): 
    x=log(n)/log(i) 
    if x==int(x): 
     print("YESSSSSSSSSSSSS!") 
     flag=True 
     break 

if not flag: 
    print("Nooooooooooooooooooo!") 

時間の複雑さをチェック私のコードです:ON

問題に他の代替/より良い方法はありますか?

+3

これは数学やプログラミングに関する質問ですか? –

+0

私はプログラミングに使うつもりですが、数学の問題として扱うことができます。 – Demonking28

+0

申し訳ありませんが、質問は、数学関連の兄弟姉妹サイトのいずれかに配置する方が適切です。 –

答えて

5

より良いアプローチは、以下のアルゴリズムのようになります。

x <- 0 
i <- 2 
found <- false 
do 
    x <- root(N, i) 
    if (x is integer) then 
     found <- true 
    end if 
    i <- i + 1 
while (x >= 2) and (not found) 

このアルゴリズムは、線形よりもはるかに高速になります。私はそれが対数だと思うが、時間をチェックしていない。

+0

root(N、i)は、iが2のときは平方根、iが3のときは立方根です。 –

+2

* i *が* N *の底2の対数に達する前に停止するため、対数です。 (もし* i *が* N *の底2の対数ならば、root(* N *、* i *)は2です) –

+0

@LajosArpadありがとう、これは私が探していたものです。 – Demonking28

関連する問題