我有一个数字(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
。
答案 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。
处理了此案。
这不像数学方法那样有效。