求大指数的 2 次方的位数?
Get the number of digits of a power of 2, with large exponents?
我正在做以下练习:The number of digits of a power of 2.。语句是:
What is the number of digits of a power of 2?
2 ---> 1 digit
2 * 2 = 4 ---> 1 digit
2 * 2 * 2 = 8 ---> 1 digit
2 * 2 * 2 * 2 = 16 ---> 2 digits
... ... ... 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 = 1024 ---> 4 digits
Then, given the exponent, what would be the number of digits of
that power?
我试过以下答案:
import java.math.BigInteger;
public class Power {
public static long digit(long exp) {
System.out.println("exp: "+exp);
BigInteger pow = BigInteger.valueOf(2).pow((int)exp);
return String.valueOf(pow).split("").length;
}
}
但是它会超时,例如:562078812
我们如何改进这个解决方案?有最快的答案吗?
我也看过:
- https://www.geeksforgeeks.org/biginteger-pow-method-in-java/
- BigInteger.pow(BigInteger)?
- Infinite Loop During Calculation of Power of Big Integers Java
最快的答案是使用数学。
2^n 中的位数是 (nlog₁₀2)+1 。
您可以通过简单地返回 n * Math.log10(2) + 1
来实现。祝你好运。
使用如下静态方法计算位数。我认为这是更快的方式
static int countDigits(int n)
{
return (int)(n * Math.log10(2) + 1);
}
十进制下,10的n次方正好有(n+1)位数字
- 10次方1有2位数。
- 10的2次方有3位数。
- 10的3次方有4位。
- ...
- .....
- n的10次方有(n+1)位。
这里的技巧是在'2'的指数中找到十进制位数。
求答案的难点在于实际计算2的n次方,然后数出位数。然而,这种方法需要巨大的计算能力。
更简单的答案在于 10 和 2 之间的差异。
如果2的幂在二进制系统中增加1,那么十进制系统中的数字只增加log 2 base 10!
对于二进制的 n 次幂,等价于
(n *log2_base_10 + 1) 十进制。
工作解决方案:
public class Power {
public static long digit(long exp) {
return (long) (Math.ceil(exp * Math.log10(2)) + 1);
}
public static void main(String[] args) {
long exp = 50000000;
System.out.println("Number of digits in 2 power " + exp
+ " = " + Power.digit(50000000));
}
}
输出:
$ javac Power.java
$ java Power
Number of digits in 2 power 50000000 = 15051501
我正在做以下练习:The number of digits of a power of 2.。语句是:
What is the number of digits of a power of 2?
2 ---> 1 digit 2 * 2 = 4 ---> 1 digit 2 * 2 * 2 = 8 ---> 1 digit 2 * 2 * 2 * 2 = 16 ---> 2 digits ... ... ... 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 = 1024 ---> 4 digits
Then, given the exponent, what would be the number of digits of that power?
我试过以下答案:
import java.math.BigInteger;
public class Power {
public static long digit(long exp) {
System.out.println("exp: "+exp);
BigInteger pow = BigInteger.valueOf(2).pow((int)exp);
return String.valueOf(pow).split("").length;
}
}
但是它会超时,例如:562078812
我们如何改进这个解决方案?有最快的答案吗?
我也看过:
- https://www.geeksforgeeks.org/biginteger-pow-method-in-java/
- BigInteger.pow(BigInteger)?
- Infinite Loop During Calculation of Power of Big Integers Java
最快的答案是使用数学。
2^n 中的位数是 (nlog₁₀2)+1 。
您可以通过简单地返回 n * Math.log10(2) + 1
来实现。祝你好运。
使用如下静态方法计算位数。我认为这是更快的方式
static int countDigits(int n)
{
return (int)(n * Math.log10(2) + 1);
}
十进制下,10的n次方正好有(n+1)位数字
- 10次方1有2位数。
- 10的2次方有3位数。
- 10的3次方有4位。
- ...
- .....
- n的10次方有(n+1)位。
这里的技巧是在'2'的指数中找到十进制位数。
求答案的难点在于实际计算2的n次方,然后数出位数。然而,这种方法需要巨大的计算能力。
更简单的答案在于 10 和 2 之间的差异。
如果2的幂在二进制系统中增加1,那么十进制系统中的数字只增加log 2 base 10!
对于二进制的 n 次幂,等价于 (n *log2_base_10 + 1) 十进制。
工作解决方案:
public class Power {
public static long digit(long exp) {
return (long) (Math.ceil(exp * Math.log10(2)) + 1);
}
public static void main(String[] args) {
long exp = 50000000;
System.out.println("Number of digits in 2 power " + exp
+ " = " + Power.digit(50000000));
}
}
输出:
$ javac Power.java
$ java PowerNumber of digits in 2 power 50000000 = 15051501