Вот пошаговый анализ вашей программы.
public static boolean validBinary(String value) {
Избавьтесь от следующего, поскольку оно не используется.
int b = Integer.parseInt(value);
Инициализация binCount
и запуск l oop.
int binCount = 0;
for(int i = 0; i < value.length(); i++) {
int tempB = value.charAt(i);
Вот здесь и начинается проблема. Даже если tempB
объявлено как int
, оно все равно имеет значение символа ASCII. Таким образом, от 0 до 9 на самом деле составляют от 48 до 57 включительно. Поэтому вместо преобразования в целые числа просто сравните их, поскольку они существуют, которые являются символами. В этом случае вы можете забыть оператор%. Таким образом, новый оператор if должен быть:
if (tempB == '0' || tempB == '1') {
вместо
if(tempB % 10 == 0 || tempB % 10 == 1) {
Сохраните оставшуюся часть кода, и программа будет работать нормально.
binCount = binCount + 1;
}
else {
binCount = -1;
break;
}
}
if (binCount > 0) {
return true;
}
else {
return false;
}
}
Возможные улучшения
Весь смысл упражнения - проверить, является ли число двоичным. Таким образом, вам не нужна бухгалтерия, например bincount
. Как только ваш тест на 0
или 1
не пройден, просто верните false
. Нет необходимости в дальнейшей обработке. Но если вы закончили sh проверку всей строки и не провалили тест, тогда все символы должны быть 0 или 1. Так что верните true
. Это будет выглядеть следующим образом.
for(int i = 0; i < value.length(); i++) {
int tempB = value.charAt(i);
if (tempB == '0' || tempB == '1') {
continue; // process next character.
// continue skips rest of loop
}
return false;
}
// no failures, so
return true;
Альтернативные логики c без continue
могут быть:
for(int i = 0; i < value.length(); i++) {
int tempB = value.charAt(i);
if (tempB != '0' && tempB != '1') {
return false;
}
}
// no failures, so
return true;