随笔 - 9  文章 - 21  trackbacks - 0
<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(1)

随笔分类(9)

随笔档案(9)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

第 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)  编辑  收藏 所属分类: 每日一题

FeedBack:
# re: 第 2 天: 解答 -- 判断是否为奇数, 问题 -- 找零钱 2008-05-16 21:55 Edward's
呵呵,1天1分钟  回复  更多评论
  
# re: 第 2 天: 解答 -- 判断是否为奇数, 问题 -- 找零钱 2008-05-16 22:37 lvq810
Java解惑  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: