почему значение c повторяется в данном коде?

#java

#java

Вопрос:

1. Это мой код для преобразования двоичного кода в десятичный, но он не работает.Значение c повторяется по некоторым причинам.

 /**
 * Created by Ranjan Yadav on 11.10.2016.
 */
public class BinaryToDecimal {
    public static void main(String[] args) {
        java.util.Scanner read = new java.util.Scanner(System.in);
        System.out.println("Enter a binary number: ");
        int binary = read.nextInt();
        int total = 0;
        int n = 1;
        int c = 0;
        int number = 0;
        while (binary != 0) {
            c = binary % ((int) Math.pow(10, n));
            binary = binary / 10;
            number = c * (int)(Math.pow(2, (n - 1)));
            total  = number;
              n;
        }
        System.out.printf("The decimal of the binary is %d", total);
    }
}
  

Комментарии:

1. Допустим, я ввожу 1110111. В первый раз 1110111 % 10 значение равно 1, и binary ему присваивается значение 111011. Во второй раз, что такое 111011 % 100 ?

2. Спасибо, c должен быть уменьшен только на 10 все время.

3. Просмотрите свой код в отладчике IDE и проверяйте промежуточные значения на каждом шаге. Это должно быстро показать вам проблему, и вы кое-чему научитесь.

4. Я отладил его в intellij, но я не знаю, как работает отладчик

5. @RANJANYADAV Вам действительно нужно научиться отлаживать свой код, после этого ваши навыки программирования повысятся на 300%. Быстрый старт: jetbrains.com/help/idea/2016.2/debugging.html

Ответ №1:

Вы одновременно увеличивали n на 1 и делили двоичный код на 10, равный n. Из-за этого вы не смогли получить цифру единицы двоичного числа после 1-й итерации. Чтобы решить эту проблему, вам нужно получить двоичный код по модулю 10 (не 10, увеличенный до n) на каждой итерации, а также сохранить оператор двоичного деления на 10.

Я упростил, а также внес некоторые небольшие изменения в ваш код для повышения удобочитаемости. Вот исправленный метод main :

 public static void main (String[] args){
    java.util.Scanner read = new java.util.Scanner(System.in);
    System.out.println("Enter a binary number: ");
    int binary = read.nextInt();
    int total = 0;
    int n = 0;
    int c = 0;
    int number = 0;
    while (binary != 0) {
        c = binary % 10;
        binary = binary / 10;
        number = c * (int)(Math.pow(2, n));
        total  = number;
          n;
    }
    System.out.println("The decimal of the binary is "   total);
}
  

Код работает и дает желаемые результаты. Дайте мне знать, если у вас возникнут какие-либо дополнительные сомнения.

Ответ №2:

Вы можете просто проанализировать целое число с parseInt помощью метода:

 java.util.Scanner read = new java.util.Scanner(System.in);
System.out.println("Enter a binary number: ");
String binary = read.nextLine();
int decimal = Integer.parseInt(binary, 2); // 2 here means the string "binary" is in binary
  

Если вам не разрешено использовать это, попробуйте этот алгоритм:

  1. Создайте переменную total и сделайте ее 0.
  2. Перебирайте двоичную строку с помощью цикла for, подобного этому: for (int i = 0 ; i < binaryString.length() ; i )
  3. На каждой итерации, если символ равен 1, добавьте Math.pow(2, binaryString.length() - 1 - i) . В противном случае ничего не делайте.