求大指数的 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

我们如何改进这个解决方案?有最快的答案吗?

我也看过:

最快的答案是使用数学。 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