Java代码整数输出

时间:2015-07-09 17:42:08

标签: java

我正在尝试编写一个将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 

我该如何解决这个问题?

6 个答案:

答案 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也适用。