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

时间:2017-04-08 02:19:38

标签: java math kotlin logarithm

我有一个数字(64位int),并且想知道它是否是10的纯幂。也就是说,1跟0表示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)(和负面版本),原因是转换为双精度时丢失了精确度并且log10精确地输出了18.0

5 个答案:

答案 0 :(得分:6)

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

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

或者甚至更好,检查10个人的权力,因为长(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;
}  

答案 1 :(得分: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;
}

答案 2 :(得分:2)

要在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
}

答案 3 :(得分:1)

我们可以帮助String类

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

答案 4 :(得分:1)

使用字符串方法

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。 处理了此案。

这不像数学方法那样有效。