Как определить, является ли число положительным или отрицательным? - PullRequest
56 голосов
/ 22 октября 2010

Меня спросили в интервью, как определить, является ли число положительным или отрицательным. Правила таковы, что мы не должны использовать условные операторы, такие как < и >, встроенные в функции Java (например, substring, indexOf, charAt и startsWith), без регулярных выражений или API .

Я сделал несколько домашних заданий по этому вопросу, код приведен ниже, но он работает только для целочисленного типа. Но они попросили меня написать общий код, который работает для float, double и long.

 // This might not be better way!!

 S.O.P ((( number >> 31 ) & 1) == 1 ? "- ve number " : "+ve number );

есть идеи с вашей стороны?

Ответы [ 33 ]

0 голосов
/ 22 октября 2010
static boolean isNegative(double v) {
  return new Double(v).toString().startsWith("-");
}
0 голосов
/ 23 октября 2010

Это решение не использует условных операторов, но основано на отлове двух исключений.

Ошибка деления означает, что число изначально было "отрицательным". В качестве альтернативы, число в конечном итоге упадет с планеты и вызовет исключение StackOverFlow, если оно положительное.

public static boolean isPositive( f)
       {
           int x;
           try {
               x = 1/((int)f + 1);
               return isPositive(x+1);
           } catch (StackOverFlow Error e) {
               return true;

           } catch (Zero Division Error e) {
               return false;
           }


   }
0 голосов
/ 22 октября 2010

Почему бы не получить квадратный корень из числа?Если он отрицательный - Java выдаст ошибку и мы ее обработаем

0 голосов
/ 10 октября 2012
if(antennaHeight.compareTo(Double.valueOf(0))>=0)

В приведенном выше коде, antennaHeight.compareTo(Double.valueOf(0)) --- это вернет int, сравнение с 0 дает решение.

0 голосов
/ 21 октября 2014

Это легко сделать как

private static boolean isNeg(T l) {
        return (Math.abs(l-1)>Math.abs(l));
 }
0 голосов
/ 11 ноября 2013

Два простых решения. Работает также для бесконечностей и чисел -1 <= r <= 1 Вернет «положительный» для NaNs. </p>

String positiveOrNegative(double number){
    return (((int)(number/0.0))>>31 == 0)? "positive" : "negative";
}

String positiveOrNegative(double number){
    return (number==0 || ((int)(number-1.0))>>31==0)? "positive" : "negative";
}
0 голосов
/ 22 октября 2010

Что ж, если воспользоваться преимуществами приведения (поскольку нам все равно, каково действительное значение), возможно, сработает следующее. Имейте в виду, что фактические реализации не нарушают правила API. Я отредактировал это, чтобы сделать имена методов более очевидными и в свете комментария @chris о проблемной области {-1, + 1}. По сути, эта проблема не может быть решена без обращения к методам API в Float или Double, которые ссылаются на собственную структуру битов float и double примитивов.

Как и все остальные: глупый вопрос на собеседовании. Grr.

public class SignDemo {

  public static boolean isNegative(byte x) {
    return (( x >> 7 ) & 1) == 1;
  }

  public static boolean isNegative(short x) {
    return (( x >> 15 ) & 1) == 1;
  }

  public static boolean isNegative(int x) {
    return (( x >> 31 ) & 1) == 1;
  }

  public static boolean isNegative(long x) {
    return (( x >> 63 ) & 1) == 1;
  }

  public static boolean isNegative(float x) {
    return isNegative((int)x);
  }

  public static boolean isNegative(double x) {
    return isNegative((long)x);
  }

  public static void main(String[] args) {


    // byte
    System.out.printf("Byte %b%n",isNegative((byte)1));
    System.out.printf("Byte %b%n",isNegative((byte)-1));

    // short
    System.out.printf("Short %b%n",isNegative((short)1));
    System.out.printf("Short %b%n",isNegative((short)-1));

    // int
    System.out.printf("Int %b%n",isNegative(1));
    System.out.printf("Int %b%n",isNegative(-1));

    // long
    System.out.printf("Long %b%n",isNegative(1L));
    System.out.printf("Long %b%n",isNegative(-1L));

    // float
    System.out.printf("Float %b%n",isNegative(Float.MAX_VALUE));
    System.out.printf("Float %b%n",isNegative(Float.NEGATIVE_INFINITY));

    // double
    System.out.printf("Double %b%n",isNegative(Double.MAX_VALUE));
    System.out.printf("Double %b%n",isNegative(Double.NEGATIVE_INFINITY));

    // interesting cases
    // This will fail because we can't get to the float bits without an API and
    // casting will round to zero
    System.out.printf("{-1,1} (fail) %b%n",isNegative(-0.5f));

  }

}
0 голосов
/ 31 мая 2013
if (v < 0) System.out.println("negative"); else System.out.println("positive");
0 голосов
/ 23 октября 2010

Неэффективно, но я думаю, что это не важно здесь: (Я тоже немного разбираюсь в Java, надеюсь, это более или менее правильный синтаксис.)

boolean isPositive = false;

int n = (int)(x * x);
while (n-- != 0)
{
    if ((int)(--x) == 0)
    {
        isPositive = true;
        break;
    }
}

Это должно работать, потому что x будет уменьшаться не более x * x раз (всегда положительное число), и если x никогда не равно 0, то для начала оно должно быть отрицательным. Если x, с другой стороны, равно 0 в какой-то момент, значит, оно должно быть положительным.

Обратите внимание, что в результате isPositive будет false для 0.

P.S .: Конечно, это не будет работать с очень большими числами, так как (int)(x * x) переполнится.

0 голосов
/ 15 сентября 2014

В математической библиотеке есть функция signnum.

http://www.tutorialspoint.com/java/lang/math_signum_float.htm http://www.tutorialspoint.com/java/lang/math_signum_double.htm

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