我如何判断一个数字是 Kotlin 中的 10 的幂还是 Java?

How can I tell if a number is a power of 10 in Kotlin or Java?

我有一个数字(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);
}

但是由于在转换为双精度并采用 log10 时精度损失,它在 isPowerOf10(999_999_999_999_999_999)(和负版本)中失败,它精确地输出 18.0.

你可以做的是一个简单的 while 循环:

static boolean isPowerOf10(long n) {
    while(n > 1 && n % 10 == 0){
        n /= 10;
    }
    return n == 1;
}

或者甚至更好,检查 10 本身的幂,因为 long (ref):

中只有 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 的幂的另一种方法。这段代码利用了这样一个事实,即只有少数数字适合 long 数据类型并且是 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
}

我们可以借助 String class

return Math.pow(10,String.valueOf(x).length()-1) == x;

使用字符串的方法

boolean isPowerOfTen(int n){

  if( n == 1)
    return true;

  String num = String.valueOf(n);

  if(num.charAt(0) == '1' && Integer.parseInt(num.substring(1)) == 0)
      return true;
  else
     return false;
}

在这里,我们检查第一个字符是否为 '1' AND
舍去第一个字符形成的子串是否为0.

这不适用于 10^0,即 1。 处理了这个案例。

这不如数学方法有效。

此解决方案也适用于负幂。例如 10 ^ -3

public boolean isPowerOfTen(double n) {
   return (Math.pow(10,Math.log10(n)) == n);
}

也适用于负幂。

boolean isPowerOf10(long number) {
    while (number % 10 == 0 && number != 0) {
        number = number / 10;
    }
    return Math.abs(number) == 1;
}