累乗数の判定
ある数が整数の累乗数(平方数,立方数,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
のようにして,許容誤差を指定したほうが実行環境が変わる状況では良いのかもしれない.
とりあえず,記事はこれくらいのレベルから書いていくことにする.