Sup*_*tar 2 java math logarithm kotlin
我有一个数字(64位int),并想知道它是否是10的纯函数.也就是说,1跟随0或0以上的零.有没有一种有效的方法来做到这一点,而不涉及将其变成一个字符串?
目前我这样做:
科特林
fun isPowerOf10(n: Long): Boolean {
val logN = Math.log10(myInt.toDouble())
return logN != Math.floor(logN)
}
Run Code Online (Sandbox Code Playgroud)
Java的
static boolean isPowerOf10(long n) {
double logN = Math.log10((double) myInt);
return logN != Math.floor(logN);
}
Run Code Online (Sandbox Code Playgroud)
但它失败了isPowerOf10(999_999_999_999_999_999)(和负面版本),因为在转换为double并且log10正确输出时精度损失18.0.
你可以做的是一个简单的while循环:
static boolean isPowerOf10(long n) {
while(n > 1 && n % 10 == 0){
n /= 10;
}
return n == 1;
}
Run Code Online (Sandbox Code Playgroud)
或者甚至更好,检查10自己的权力,因为只有19(长)(参考):
public static boolean isPowerOf10(long n) {
return
n == 1L
|| n == 10L
|| n == 100L
|| n == 1000L
|| n == 10000L
|| n == 100000L
|| n == 1000000L
|| n == 10000000L
|| n == 100000000L
|| n == 1000000000L
|| n == 10000000000L
|| n == 100000000000L
|| n == 1000000000000L
|| n == 10000000000000L
|| n == 100000000000000L
|| n == 1000000000000000L
|| n == 10000000000000000L
|| n == 100000000000000000L
|| n == 1000000000000000000L;
}
Run Code Online (Sandbox Code Playgroud)
这是另一种可以检查数字是10的幂的方法.该代码利用了这样一个事实:只有少数数字适合长数据类型并且是10的幂.
public static boolean isPowerOfTen(long number){
long[] powersOfTen = new long[] {
1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000, 100000000000, 1000000000000, 10000000000000, 100000000000000, 1000000000000000, 10000000000000000, 100000000000000000, 1000000000000000000
};
return Arrays.binarySearch(powersOfTen, number) >= 0;
}
Run Code Online (Sandbox Code Playgroud)