Как я могу определить, является ли число 10 в Котлине или Яве?

У меня есть число (64-битный int) и вы хотите знать, является ли это чистой мощностью 10. То есть, 1 последовал за 0 или более нулями. Есть ли эффективный способ сделать это, который не включает превращение его в строку?


В настоящее время я делаю это:

Котлин

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

Ява

 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 в длинном (ref) :

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

    Чтобы сделать вторую часть ответа Рика Шаафа в Котлине, вы можете сделать что-то вроде:

     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 }