如何判断Kotlin或Java中的数字是10的幂?

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.

Rik*_*aaf 7

你可以做的是一个简单的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)


Aru*_*lla 5

这是另一种可以检查数字是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)

  • 使用`HashMap`可以让它更快!(假设您只需要设置一次映射,但可以多次调用该方法.) (2认同)