第 1 天的问题
下面的方法意图确定它那唯一的参数是否是一个奇数。这个方法能够正确运转吗?
public static boolean odd(int number) {
return number % 2 == 1;
}
第 1 天问题的解答
有1/4的情况下,答案是错误的。比如:odd(-3) 表达式得到的结果就是 fasle。对于所有的负奇数,上面的方法都会得到错误的结果。
原因
问题的原因在于求余操作符(%),在Java中该操作符被定义为
对于所有的 int 数值 a 和所有的非零 int 数值 b,都满足下面的恒等式
(a / b) * b + (a % b) == a
换句话说,(a % b) = a - (a / b) * b
由数学推理运算可知,a % b 的符号有操作数a决定(要么为0,要么和a一致)。也就是说, -5 % 3 => -2, -5 % -3 => -2。
因此,对于所有的负奇数n, n % 2 => -1。问题中的方法自然有问题啦。
解决办法
要判断一个整数是否为奇数的解决办法有两种。
public static boolean odd(int number) {
return number % 2 != 0;
}
/**
* 这种方法的性能更好。
*/
public static boolean odd(int number) {
return (number & 1) != 0;
}
总结
无论你何时使用到了取余操作符,都要考虑到操作数和结果的符号。
该操作符的行为在其操作数非负时是一目了然的,但是当一个或两个操作数都是负数时,它的行为就不那么显而易见了。
今天的问题
请考虑下面这段话所描述的问题:
小明在超市购买了一个价值¥1.10的东西,但是他钱包中只有两元一张的钞票。如果他用一张两元的钞票支付,那么应该找给他多少零钱呢?
下面是一个试图解决上述问题的程序,它会打印出什么呢?
public class Change{
public static void main(String args[]){
System.out.println(2.00 - 1.10);
}
}
posted on 2008-05-16 21:38
李四飞刀 阅读(1295)
评论(2) 编辑 收藏 所属分类:
每日一题