Как поместить числа в массив в то время как цикл в Java? - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь добавить два двоичных числа и затем получить их сумму в двоичной системе.Я получил их сумму в десятичном виде, и теперь я пытаюсь превратить ее в двоичную.Но есть проблема в том, что когда я беру их сумму (в десятичном виде) и делю на 2 и нахожу остатки (в цикле while), мне нужно поместить остатки в массив для того, чтобы вывести обратное.Однако в части массива есть ошибка.Есть ли у вас какие-либо предложения с моим кодом?Заранее спасибо.

Вот мой код:

import java.util.Scanner;

public class ex1 {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int m = scan.nextInt();
        int k = dec1(n)+dec2(m);

        int i=0,c;
            int[] arr= {};

        while(k>0) {
            c = k % 2;
        k = k / 2;
                arr[i++]=c;   //The problem is here. It shows some //error
        }
          while (i >= 0) {
        System.out.print(arr[i--]);
        }
    }

    public static int dec1(int n) {
        int a,i=0;
        int dec1 = 0;
        while(n>0) {
        a=n%10;
        n=n/10;
        dec1= dec1 + (int) (a * Math.pow(2, i));
        i++;
        }
        return dec1;
    }

    public static int dec2(int m) {
        int b,j=0;
        int dec2 = 0;
        while(m>0) {
        b=m%10;
        m=m/10;
        dec2= dec2 + (int) (b  * Math.pow(2, j));
        j++;    
        }
        return dec2;
        }


}

Ответы [ 2 ]

3 голосов
/ 11 июня 2019

Здесь:

int[] arr= {};

создает массив пустой .Массивы не растут динамически в Java.Поэтому любая попытка доступа к любому индексу arr приведет к исключению ArrayIndexOutOfBounds.Поскольку пустые массивы вообще не имеют «индекса в границах».

Итак:

  • сначала спросите пользователя о количестве чисел, которые он хочет ввести
  • , затемсделайте так: int[] arr = new int[targetCountProvidedByUser];

Реальным ответом «больше» будет использование List<Integer> numbersFromUsers = new ArrayList<>();, поскольку такие классы Collection позволяют динамически добавлять / удалять элементы.Но для новичка в Java лучше сначала научиться обращаться с массивами.

0 голосов
/ 11 июня 2019

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

Вы могли бы сделать это в основном методе.

 int k = dec1(n)+dec1(m);

Вместо использования Math.pow, который возвращает двойное число и должен быть разыгран, другой альтернативой является следующее:

      int dec = 0;
      int mult = 1;
      int bin = 10110110; // 128 + 48 + 6 = 182.
      while (bin > 0) {
         // get the right most bit
         int bit = (bin % 10);

         // validate
         if (bit < 0 || bit > 1) {
            throw new IllegalArgumentException("Not a binary number");
         }

         // Sum up each product, multiplied by a running power of 2.
         // this is required since bits are taken from the right.
         dec = dec + mult * bit;
         bin /= 10;
         mult *= 2; // next power of 2
      }
      System.out.println(dec); // prints 182

Альтернативой этому является использование строки для представления двоичного числа и взятия бит слева (позиция старшего разряда).

      String bin1 = "10110110";
      int dec1 = 0;
      // Iterate over the characters, left to right (high to low)
      for (char b : bin1.toCharArray()) {

         // convert to a integer by subtracting off character '0'.
         int bit = b - '0';

         // validate
         if (bit < 0 || bit > 1) {
            throw new IllegalArgumentException("Not a binary number");
         }
         // going left to right, first multiply by 2 and then add the bit
         // Each time thru, the sum will be multiplied by 2 which shifts everything left
         // one bit.
         dec1 = dec1 * 2 + bit;
      }

      System.out.println(dec1); // prints 182

Одним из возможных способов отображения результата в двоичном виде является использование StringBuilder и просто вставка преобразованных битов в символы.

  public static String toBin(int dec) {
      StringBuilder sb = new StringBuilder();

      while (dec > 0) {
         // by inserting at 0, the bits end up in
         // correct order.  Adding '0' to the low order
         // bit of dec converts to a character.
         sb.insert(0, (char) ((dec & 1) + '0'));

         // shift right for next bit to convert.
         dec >>= 1;
      }
      return sb.toString();
   }
...