【问题标题】:Get the number of digits of a power of 2, with large exponents?获得大指数的 2 的幂的位数?
【发布时间】:2020-02-02 12:00:22
【问题描述】:
我正在做以下练习:The number of digits of a power of 2.。声明是:
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
那么,给定指数,数字的位数是多少
那种力量?
我尝试了以下答案:
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
我们如何改进这个解决方案?有最快的答案吗?
我也看过:
【问题讨论】:
标签:
java
string
math
int
pow
【解决方案1】:
最快的答案是使用数学。
2^n 中的位数是 (nlog₁₀2)+1 。
您可以通过简单地返回n * Math.log10(2) + 1 来实现。祝你好运。
【解决方案2】:
在十进制系统中,10 次方 n 中正好有 (n+1) 个数字。
- 10 次方 1 有 2 个数字。
- 10 次方 2 有 3 位。
- 10 次方 3 有 4 位。
- ...
- .....
- 10 次幂 n 有 (n+1) 位。
这里的诀窍是在“2”的指数中找到十进制位数。
找到答案的困难方法是实际计算 2 次幂 n,然后计算位数。但是,这种方法需要巨大的计算能力。
更简单的答案在于 10 和 2 之间的差异。
如果二进制系统中 2 的幂加 1,那么十进制系统中的数字仅以 log 2 为底以 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 电源
2 次方 50000000 = 15051501 的位数
【解决方案3】:
使用如下静态方法计算位数。我认为这是更快的方式
static int countDigits(int n)
{
return (int)(n * Math.log10(2) + 1);
}