我正在尝试编写一个将2提升到
的代码0,1,2的权力.3。4,...... n
例如,对于31,它将重现以下结果:
1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192
16384 32768 65536 131072 262144 524288 1048576 2097152
4194304 8388608 16777216 33554432 67108864 134217728
268435456 536870912 1073741824 2147483648
我写了以下代码:
public class Powersof2 {
public static void printPowersOf2(int n) {
if (n >= 0 && n <= 64) {
for (int i = 0 ; i <= n ; i++) {
System.out.print( Math.pow(2, i) + " ");
}
} else {
System.out.println("You have input an invalid value");
return;
}
}
public static void main(String[] args) {
printPowersOf2(31);
System.out.println();
}
}
但是,它会产生以下结果:
1.0 2.0 4.0 8.0 16.0 32.0 64.0 128.0 256.0 512.0
1024.0 2048.0 4096.0 8192.0 16384.0 32768.0 65536.0
131072.0 262144.0 524288.0 1048576.0 2097152.0 4194304.0
8388608.0 1.6777216E7 3.3554432E7 6.7108864E7 1.34217728E8
2.68435456E8 5.36870912E8 1.073741824E9 2.147483648E9
我该如何解决?
我还有另一个问题
当我为n输入较大的值(如62)时,值开始相同。例如62给出:
1 2 4 8 16 32 64 128 256 512 1024 2048 4096
8192 16384 32768 65536 131072 262144 524288 1048576
2097152 4194304 8388608 16777216 33554432 67108864 134217728
268435456 536870912 1073741824 2147483647 2147483647
2147483647 2147483647 2147483647 2147483647 2147483647
2147483647 2147483647 2147483647 2147483647 2147483647
2147483647 2147483647 2147483647 2147483647 2147483647
2147483647 2147483647 2147483647 2147483647 2147483647
2147483647 2147483647 2147483647 2147483647 2147483647
2147483647 2147483647 2147483647 2147483647 2147483647
我该如何解决这个问题?
答案 0 :(得分:3)
由于Math.pow
在您查找整数时会返回double
,因此请考虑使用简单的位技巧将2提升为n
,如下所示:
1L << n
这个技巧背后的原因与在十进制系统中乘以十的幂后面的原因相同,就是在数字之后写入额外的零。
这适用于0到63之间的n
,并产生long
:
for (int i = 0 ; i <= n ; i++) {
System.out.print( (1L << i) + " ");
}
答案 1 :(得分:2)
Math.pow()
总是会返回双打。你需要将它转换为int。 System.out.print((int)Math.pow(2, i)+ " ");
答案 2 :(得分:1)
因为public static double pow(double a, double b)
返回一个双精度数。并且Java double
是精确的64位IEE754数字,所以你最后会看到小数点。
您可以将int
转换为(int)Math.pow(2, i)
,但请注意,对于2 ^ 31以后您将无法获得预期的结果,因为int
范围来自-2 ^ 31到+ 2 ^ 31。
**第一个解决方案:**
因此,为了使您的预期结果达到63,请转换为long
,因为Java long
的范围从-2 ^ 63到+ 2 ^ 63
for (int i = 0; i <= 64; i++) {
System.out.println((long)Math.pow(2, i));
}
您查询的结果如此多2147483647 :
当较大的容器值转换为较小的容器值时,这称为缩小。
以下摘自Java Language Specification - $5.1.3 Narrowing Primitive Conversion,关于原始缩小的规则。
因此,在31次幂之后,所有较高位(32,33 ....)都被丢弃,因此总是产生31位,即2 ^ 31。
在您的情况下,根据JLS,您的&#34;整数类型T&#34;是int
,所以所有位都被丢弃,但是n个最低位(这意味着31,因为你缩小到int
)
将有符号整数缩小转换为整数类型T. 简单地丢弃除n个最低位之外的所有位,其中n是数字 用于表示类型T的位数。除了可能的丢失 有关数值大小的信息,这可能会导致 结果值的符号与输入符号不同 值。
全面解决方案:(根据讨论情况而定)
原始数据类型具有范围限制,因此有BigInteger,BigDecimal可提供任意长的值和精度。因此,您可以使用BigInteger
来获得准确的结果。
请注意如果您的Java长了2 ^ 63,那么结果为9223372036854775807
,而Power of two Wiki结果应为9223372036854775808
您使用BigInteger
底线:使用BigInteger
获得所需的2的功率范围。
希望这能满足您的所有顾虑,并为您提供可扩展的解决方案。
for (int i = 0; i <= 64; i++) {
//System.out.println((long)Math.pow(2, i));
System.out.println(BigInteger.valueOf(2).pow(i)); //Gives exact result as per Wiki information
}
答案 3 :(得分:1)
这些是2
到2 ^ 31的权力,只是double
的默认输出格式。值越小,它将追加.0
,值越高,它就是伪科学符号。例如。 1.6777216E7
表示1.677216 x 10 7 ,或1,677,216。从double
返回Math.pow
。
您可能会发现为您的目的更好地格式化的整数类型数据类型。使用long
,因为int
不够大,无法存储2 ^ 31。
long product = 1;
for (int i = 0 ; i <= n ; i++)
{
System.out.print( product + " ");
product *= 2; // Equivalent: product <<= 1;
}
答案 4 :(得分:0)
我可以使用下面的代码部分,而不是math.pow(),我总是害怕类型转换
int num=1;
for(int i=0;i<n;i++){
System.out.println(num);
num=num*2;
}
但正如所建议的那样,它不能超过31。它是int数据类型的限制。如果你想打印更多
,请尝试BigInteger答案 5 :(得分:0)
使用Java 8,您可以简单地使用以下流:
IntStream.range(0, 32)
.map(value -> 1 << value)
.forEach(value -> System.out.println("value = " + value));
此外,LongStream
也适用。