我如何判断一个数字是 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;
}
我有一个数字(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):
中只有 19public 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;
}