在Kotlin或Java中,如何判断一个数是否是10的幂数?

我有一个数字(64位整数),并想知道它是否是一个纯粹的权力10.也就是说,一个1接0或更多的零。 有没有一种有效的方式来做到这一点, 而不是把它变成一个字符串?


目前我正在这样做:

科特林

fun isPowerOf10(n: Long): Boolean { val logN = Math.log10(myInt.toDouble()) return logN != Math.floor(logN) } 

Java的

 static boolean isPowerOf10(long n) { double logN = Math.log10((double) myInt); return logN != Math.floor(logN); } 

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; } 

或者,甚至更好,检查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; } 

这是另一种方法,您可以检查数字是否是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; } 

为了在Kotlin做出Rik Schaaf的答案的第二部分,你可以这样做:

 val Long.isPowerOfTen get() = when (this) { 1L, 10L, 100L, 1000L, 10000L, 100000L, 1000000L, 10000000L, 100000000L, 1000000000L, 10000000000L, 100000000000L, 1000000000000L, 10000000000000L, 100000000000000L, 1000000000000000L, 10000000000000000L, 100000000000000000L, 1000000000000000000L -> true else -> false } 
Interesting Posts