あんまり見ないでください

プログラミング・技術関連,アイディア,気づいたことなどを低レベルで垂れ流す場所.

累乗数の判定

ある数が整数の累乗数(平方数,立方数,4乗数,...)かどうかの判定の方法について,ちょっと考えた.結局,n乗根が整数かどうかを判定するというシンプルな方策にした.

1は1以外の累乗根となり得ないので,判定する数のn乗根が2未満になったら終了とした.例えば,10の3乗根は2.15...,10の4乗根は1.77... なので,n=3まで整数か判定する.

public class Hogehoge {
    public static void main(String[] args) {
        for (int i = 2; i <= 10; i++) {
            System.out.println("isPower(" + i + ") = " + isPower(i));
        }
    }

    public static boolean isPower(int num) {
        if (num == 1) return false;

        for (int n = 2; Math.pow(num, 1.0 / n) >= 2.0; n++) {
            double nThRoot = Math.pow(num, 1.0 / n);
            if (nThRoot - Math.floor(nThRoot) == 0.0)
                return true;
        }

        return false;
    }
}

<実行結果>

isPower(2) = false
isPower(3) = false
isPower(4) = true
isPower(5) = false
isPower(6) = false
isPower(7) = false
isPower(8) = true
isPower(9) = true
isPower(10) = false


<整数の判定の許容誤差>
整数かどうかの判定について後で調べたら,誤差を考慮すべきとあったので,判定式を

Math.abs(nThRoot - Math.floor(nThRoot)) < 0.00001

のようにして,許容誤差を指定したほうが実行環境が変わる状況では良いのかもしれない.


とりあえず,記事はこれくらいのレベルから書いていくことにする.