Ashvin氏シャルマ:
数(N)は次のように表すことができる場合、私は、チェックに対する解決策を書きました
A> 0かつP> 1私は、このソリューションの複雑さはO(だと思う場合)
しかし、私はちょうど私が私の結論に来て助けたループの動作を理解し、私は、ログのベースについてはわからないと私は数学的な説明はありません。
public int isPower(int A) {
for (int i = 2; i <= Math.sqrt(A); i++) {
for (int j = 2; j <= (Math.log(A) / Math.log(i)); j++) {
if ((int)Math.pow(i, j) == A)
return 1;
}
}
return (A == 1) ? 1: 0;
}
私は面接の準備をしていますし、任意のソリューションをいただければ幸い、私はより良い準備に役立ちます。あなたが考える場合にも、この問題はより速く私のアルゴリズムは、私に知らせてより行うことができます。
アビシェークガーグ:
ソリューションのAshwinを修正してくれてありがとう。
あなたは完全に再び第二のループを繰り返す必要はありませんし、唯一の値チェックを行うことができます。サンプルコードは次のようになります。
public int isPower(int a) {
if (a == 1) {
return 1;
}
for (long i = 2; i * i <= a; i++) {
final double value = Math.log(a) / Math.log(i);
if (value - (int) value < 0.00000001) {
return 1;
}
}
return 0;
}
この溶液に、O(SQRT(N))の複雑。私は、これが最も効率的な解決策だと思います。