2016-04-19 3 views
0

Я пытаюсь написать программу, которая будет проверять, является ли введенная пользователем строка двоичным числом, и если она есть, она выведет число 1 в номер. У меня была эта работа с целым значением, но поскольку int не может содержать более 2 миллиардов или что-то большее, я пытаюсь переписать его для работы со строками.Проверка, была ли строка введена двоичным числом, получение неправильного вывода

На данный момент любое число, которое я вводил, будет выводить «Введенный номер не является двоичным». и когда я введу 0, я получу исключение StringIndexOutofBoundsException. Я довольно начинающий программист, поэтому прощайте любые очевидные ошибки, которые я, возможно, пропустил, я просто прошу о возможном решении моей проблемы или толчке в правильном направлении. Вот мой код (после попытки заставить его работать со строками, а не целые числа):

import java.util.*; 

    public class BinaryHW { 
    public static void main(String[] args) { 

    Scanner kb = new Scanner(System.in); 
    System.out.println("Enter a binary number: "); 
    String bin = kb.nextLine(); 

    //the method I used to check whether or not user entered a binary 
    //number requires changing the value of 'bin'. 
    //Therefore, 'origBin' set equal to 'bin' for later use. 

    String origBin = bin; 
    int count = 0; 

    boolean isBinary = true; 
    /* if bin = 0, then this loop will be skipped because 
    * 0 is a binary number and need not be checked. 
    */ 

    while (Integer.parseInt(bin) != 0) { 

    int lastDigit = bin.charAt(bin.length() - 1); 

    if (lastDigit > 1) { 
     System.out.println("Number entered is not binary."); 
     isBinary = false; 
     break; 

    } else { 
     bin = bin.substring(bin.length() - 2); 
    } 
    } 
    //Again, the method I used to count the 1s in the bin number 
    //requires changing the value of origBin, so origBin2 is introduced 

    String origBin2 = origBin; 

    for (int i = 0; i < origBin.length(); i++) { 

    if (origBin.charAt(origBin.length() - 1) == 1) { 
     count ++; 
     origBin2 = origBin.substring(origBin2.length() - 2); 

    } else { 
     origBin2 = origBin.substring(origBin2.length() - 2); 

    } 

    } 

    if (isBinary) 
    if (count == 1) 
    System.out.println("There is " 
     + count + " 1 in the binary number entered."); 
    else 
    System.out.println("There are " 
     + count + " 1s in the binary number entered."); 

    } 
} 
+0

В вашей петле нет никакого смысла. Что вы пытаетесь достичь? Конечно, вы получите индекс за пределами поля, когда вы вызываете 'origBin2.length() - 2' на строку длиной 1 – redFIVE

+0

. Вы также были смущены символом« 1 »и шестнадцатеричным 1, поэтому вы всегда получить «введенный номер не является двоичным» –

+0

Джонатан, вам нужно действительно потратить некоторое время на чтение документации о ваших методах, которые вы пытаетесь использовать. – redFIVE

ответ

0

Я думаю, что вы усложнять вещи ... просто итерацию через двоичную строку, и следить за числом 1 достиг , Если найдено число, отличное от 0 или 1, сообщите, что ввод является не двоичным числом. Ниже приведен фрагмент, который выполняет следующие действия:

public static void main(String[] args) { 

     Scanner kb = new Scanner(System.in); 
     System.out.println("Enter a binary number: "); 
     String bin = kb.nextLine(); 
     int oneCount = 0; 
     boolean validBinaryNum = true; 

     for (int i = 0; i < bin.length() && validBinaryNum; i++) { 
      char currentChar = bin.charAt(i); 
      if (currentChar == '1') oneCount++; 
      else if (currentChar != '0') { 
       validBinaryNum = false; 
      } 
     } 

     if (validBinaryNum && bin.length() != 0) { 
      System.out.println("Number of 1's: " + oneCount); 
     } else { 
      System.out.println("Number is not binary"); 
     } 

} 
Смежные вопросы