Разница в выводе в Java и других языках в генерации подпоследовательностей - PullRequest
0 голосов
/ 05 июня 2018

Обновление: у меня вопрос, зачем нам нужен BigInteger в Java.Почему мы не можем решить вопрос непосредственно с псевдокодом, поскольку он работает на любом другом языке.

Это псевдокод для генерации подпоследовательностей массива.

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.На любом другом языке вывод:

1 
2 
1 2 
3
1 3 
2 3
1 2 3 

. В 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 вывод для того же кода:

1 

1 

1 

1 

В 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();
    }

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Это неправильная строка кода:

if ((i & (1<<j)) == 1 )

Это не то же самое, что if (counter & (1<<j)) в C - в C целое число эквивалентно «истинному» условию, если его значение равно не ноль .

Чтобы исправить это, вы должны написать:

if ((i & (1<<j)) != 0)

После этого изменения результат будет таким, как вы ожидали.

0 голосов
/ 05 июня 2018

Ваше состояние плохое: (i & (1<<j)) == 1

Это должно быть (i & (1<<j)) != 0

Пример, для i=6=0b0110 и j=1=0b0001:

1<<j == 2 == 0b0010
i & (1<<j) == 0b0110 & 0b0010 == 0b0010 == 2
0 голосов
/ 05 июня 2018

РЕДАКТИРОВАТЬ: я немного неправильно прочитал вопрос.

Код без BigInteger имеет проблему:

if ((i & (1<<j)) == 1 )

В битовом сдвиге вы сдвигаетесь на j.Это верно только в том случае, если j = 0 и у меня установлен первый бит.

Предположим, что у нас есть:

i=5
j=2

Тогда мы делаем сдвиг битов и имеем следующие двоичные представления:

i = 0101
j = 0100

После операции И мы имеем:

0100

Что явно не удовлетворяет условию.

Если вы измените его на:

if ((i & (1<<j)) > 0 )

Это работает, потому что ответ> 0, если установлен определенный бит, определенный 1 << j. </p>

РЕДАКТИРОВАТЬ: Удален оригинальный ответ, который не ответил на вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...