在一次采访中,我被问到如何确定一个数字是正数还是负数。规则是,我们不应该使用关系运算符,如<
和>
,内置在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 );
你有什么想法吗?
发布于 2010-10-22 21:10:09
整数的情况很简单。双重情形要复杂得多,直到你还记得无穷大。
注意:如果你认为双常量是“应用程序接口的一部分”,你可以用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");
}
发布于 2010-10-22 15:14:16
下面是一个可怕的方法,它会让你在任何工作中被解雇。
这取决于你得到一个Stack Overflow异常,或者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
}
}
}
发布于 2010-10-22 15:57:35
这将只适用于除0..2之外的所有对象。
boolean isPositive = (n % (n - 1)) * n == n;
你可以像这样做一个更好的解决方案(0..1除外)
boolean isPositive = ((n % (n - 0.5)) * n) / 0.5 == n;
可以通过将0.5部分更改为类似2^m (m整数)的形式来获得更高的精度:
boolean isPositive = ((n % (n - 0.03125)) * n) / 0.03125 == n;
https://stackoverflow.com/questions/3994531
复制相似问题