Java和其他语言在生成子序列时的输出差异
更新:我的问题是为什么Java中需要BigInteger。为什么我们不能直接在伪代码上解决这个问题,因为它在其他语言中都可以工作 这是用于生成数组子序列的伪代码Java和其他语言在生成子序列时的输出差异,java,c++,arrays,subsequence,Java,C++,Arrays,Subsequence,更新:我的问题是为什么Java中需要BigInteger。为什么我们不能直接在伪代码上解决这个问题,因为它在其他语言中都可以工作 这是用于生成数组子序列的伪代码 int[] arr = {1,2,3} ; int opsize = 2^size_of_array ; for (int counter = 1; counter < opsize; counter++) { for (int j = 0; j < n; j++) { if (co
int[] arr = {1,2,3} ;
int opsize = 2^size_of_array ;
for (int counter = 1; counter < opsize; counter++)
{
for (int j = 0; j < n; j++)
{
if (counter & (1<<j))
print(arr[j] + " ");
}
print new line ;
}
在Java中,代码是
class Solution
{
public static void main (String[] args) throws java.lang.Exception
{
int[] arr = {1,2,3};
int n = arr.length ; ;
int res = (int) Math.pow(2,n);
for(int i = 1 ; i < res ; i++)
{
for(int j = 0 ; j < n ; j++)
if ((i & (1<<j)) == 1 )
System.out.print(arr[j] + " ");
System.out.println();
}
}
}
在Java中,我们需要BigInteger来解决同样的问题
int opsize = (int)Math.pow(2, n);
for (int counter = 1; counter < opsize; counter++)
{
for (int j = 0; j < n; j++)
{
if (BigInteger.valueOf(counter).testBit(j))
System.out.print(arr[j]+" ");
}
System.out.println();
}
intopsize=(int)Math.pow(2,n);
用于(int计数器=1;计数器
编辑:我把问题读错了一点
没有BigInteger的代码有一个问题:
if ((i & (1<<j)) == 1 )
然后我们进行位移位,并使用以下二进制表示:
i = 0101
j = 0100
手术后,我们有:
0100
这显然不符合条件
如果将其更改为:
if ((i & (1<<j)) > 0 )
if((i&(10)如果由1定义的特定位这是有问题的代码行:
if ((i & (1<<j)) == 1 )
如果((i&(1您的病情不好:
(i&(1)和..您的问题是?您可以在没有BigInteger的情况下执行此操作,只需对代码进行一些其他更改。实际上,您不能调用(实例)基本类型上的方法除了缺少一个问题之外,您所说的也是完全错误的。代码在Java中执行得很好,没有使用任何biginger
。不知道您在做什么。n
只是神奇地出现在您的代码中?我只是假设n
是数组的大小。但是,是的,变量的神奇外观当然没有帮助。所以你的C++问题是为什么你没有显示的一些java代码不做你期望的那样做?这不是答案。他说<代码> BigInteger <代码>代码。问题是如果你把比特移到最有效位(j=31),然后您得到一个负数,您的>0
条件失败。C代码的等价物不是>0
,而是!=0
。
0100
if ((i & (1<<j)) > 0 )
if ((i & (1<<j)) == 1 )
if ((i & (1<<j)) != 0)
1<<j == 2 == 0b0010
i & (1<<j) == 0b0110 & 0b0010 == 0b0010 == 2