如何确定一个数字是正数还是负数?

2022-08-31 17:25:27

在一次采访中,我被问到,如何确定一个数字是正数还是负数。规则是,我们不应该使用关系运算符,例如,和,内置于java函数中(如,,,和),没有正则表达式或API。<>substringindexOfcharAtstartsWith

我对此做了一些功课,下面给出了代码,但它仅适用于整数类型。但是他们要求我编写一个适用于 、 和 的通用代码。floatdoublelong

 // This might not be better way!!

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

你有什么想法吗?


答案 1

整数情况很简单。双例更棘手,直到你记住无穷大。

注意:如果您将双常量视为“api 的一部分”,则可以将它们替换为溢出表达式,例如 .1E308 * 2

int sign(int i) {
    if (i == 0) return 0;
    if (i >> 31 != 0) return -1;
    return +1;
}
int sign(long i) {
    if (i == 0) return 0;
    if (i >> 63 != 0) return -1;
    return +1;
}
int sign(double f) {
    if (f != f) throw new IllegalArgumentException("NaN");
    if (f == 0) return 0;
    f *= Double.POSITIVE_INFINITY;
    if (f == Double.POSITIVE_INFINITY) return +1;
    if (f == Double.NEGATIVE_INFINITY) return -1;

    //this should never be reached, but I've been wrong before...
    throw new IllegalArgumentException("Unfathomed double");
}

答案 2

以下是一种可怕的方法,会让你在任何工作中被解雇......

这取决于你得到一个堆栈溢出异常[或任何Java调用它]...它只适用于不会像疯了一样偏离0的正数。

负数很好,因为你会溢出到正数,然后最终得到一个堆栈溢出异常[这将返回false,或者“是的,它是负数”]

Boolean isPositive<T>(T a)
{
  if(a == 0) return true;
  else
  {
    try
    {
      return isPositive(a-1);
    }catch(StackOverflowException e)
    {
      return false; //It went way down there and eventually went kaboom
    }
  }
}