`
BruceGao
  • 浏览: 27317 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA奇数的判断

    博客分类:
  • Java
阅读更多

下面的方法意图确定它那唯一的参数是否是一个奇数。这个方法能够正确运转吗?

   public static boolean isOdd(int i){

             return i % 2 == 1;

   }

  奇数可以被定义为被2整除余数为1的整数。表达式 i % 2 计算的是 i 整除 2 时所产生的余数,因此看起来这个程序应该能够正确运转。遗憾的是,它不能;它在四分之一的时间里返回的都是错误的答案。

为什么是四分之一?因为在所有的 int 数值中,有一半都是负数,而 isOdd 方法对于对所有负奇数的判断都会失败。在任何负整数上调用该方法都回返回 false ,不管该整数是偶数还是奇数。

这是 Java 对取余操作符(%)的定义所产生的后果。该操作符被定义为对于所有的 int 数值 a 和所有的非零 int 数值 b,都满足下面的恒等式:

       (a / b) * b + (a % b) == a

  换句话说,如果你用b整除a,将商乘以b,然后加上余数,那么你就得到了最初的值 a 。该恒等式具有正确的含义,但是当与 Java 的截尾整数整除操作符相结合时,它就意味着:当取余操作返回一个非零的结果时,它与左操作数具有相同的正负符号。

i 是一个负奇数时,i % 2 等于-1而不是1, 因此 isOdd 方法将错误地返回 false。为了防止这种意外,请测试你的方法在为每一个数值型参数传递负数、零和正数数值时,其行为是否正确。

这个问题很容易订正。只需将 i % 2 与0而不是与1比较,并且反转比较的含义即可:

   public static boolean isOdd(int i){

             return i % 2 != 0;

   }

  如果你正在在一个性能临界(performance-critical)环境中使用isOdd方法,那么用位操作符AND(&)来替代取余操作符会显得更好:

   public static boolean isOdd(int i){

             return (i & 1) != 0;

   }

  总之,无论你何时使用到了取余操作符,都要考虑到操作数和结果的符号。该操作符的行为在其操作数非负时是一目了然的,但是当一个或两个操作数都是负数时,它的行为就不那么显而易见了。

 

分享到:
评论

相关推荐

    菜鸟简单java程序键盘录入数判断偶数和奇数

    简单java程序键盘录入数判断偶数和奇数.提示用户输入5个100-200(包含100和200)之间的数字判断是不是偶数如果是就将其存放在一个集合当中

    使用JAVA,判断数据奇数和偶数的个数

    读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据;程序输出读到的数据中的奇数和偶数的个数。

    Java用三元运算符判断奇数和偶数的简单实现

    主要介绍了Java用三元运算符判断奇数和偶数的简单实现,需要的朋友可以参考下

    Java Puzzlers 中文版(Java解惑)

    Java Puzzlers 中文版(Java解惑) ...因为在所有的 int 数值中,有一半都是负数,而 isOdd 方 法对于对所有负奇数的判断都会失败。在任何负整数上调用该方法都回返回 false ,不管该整数是偶数还是奇数。

    Java位运算的应用

    (1) 判断int型变量a是奇数还是偶数 a&1 = 0 偶数 a&1 = 1 奇数 (2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1 (3) 将int型变量a的第k位清0,即a=a&~(1 ) (4) 将int型变量a的第k位置1, 即a=a ...

    3n+1问题java源码

    如果 n 是奇数,把它乘 3 加1。 用新得到的值重复上述步骤,直到 n = 1 时停止。例如,n = 22 时该算法生成的序列是: 22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1 人们猜想(没有得到证明)对于...

    Java期末复习题编程题(47道)和选择题(30道) 包括异常处理和接口以及普通编程题

    编写一个Java程序,从键盘读取一个整数并判断它是奇数还是偶数。 编写一个Java程序,计算并输出斐波那契数列的前 n 个数字,其中 n 是用户从键盘输入的整数。 编写一个Java程序,计算并输出给定整数的阶乘。 编写一...

    Java经典编程300例(完整版+源码

    本书内容包括java语言概述、 eclipse开发工具、 java语言基础、 流程控制、 ...实例016 用三元运算符判断奇数和偶数 .  实例017 不用乘法运算符实现2×16 实例018 实现两个变量的互换(不借助第3个变量)

    java 黑白棋源码加文档

    第一等为边角分配权值300,第二等为奇数边和奇数角分配权值200,剩余部分为第三等,分配权值100.然后在下棋的过程中如果某一行或者某一列满了,则该行或列旁边的行或列权值增加100. 2.电脑等级 电脑水平分为三个...

    Java经典编程源码基础例程300.zip

    实例016 用三元运算符判断奇数和偶数 21 实例017 不用乘法运算符实现2×16 22 实例018 实现两个变量的互换 (不借助第3个变量) 23 第4章 流程控制 25 实例019 判断某一年是否为闰年 26 实例020 验证登录信息的合法...

    java 基础的课堂笔记整理

    2.3.2、 求 100 以内的整数 的奇数和。 4 2.3.3、。。。。。。。。。。。。。。。。。。。。。。偶数和。 5 2.4 实例演示: 6 2.4.1//判断奇偶数算法。 6 2.4.2&的用法 7 2.4.3瑞年的判断: 7 2.4.4// 6592 //6//5//...

    Java面试 Java超级经典100问题 Java高级开发工程师必备 Java面试宝典

    Java面试 Java超级经典100问题 Java高级开发工程师必备 Java面试宝典 1.赋值运算函数.2.单例设计模式.3.二维数组中查找目标值、4.替换字符串中的空格。5.从尾到头打印链表.6.由前序和中序遍历重建二叉树.7.用两个栈...

    Java的算数方法.docx

    //例:判断一个整数是奇数还是偶数,并将价格打印输出, //定义一个变量存放数据 //int n=11; //从键盘接受数据 //输入一个整数 //求a和b的最大值 //闰年的判断规则:能被4整除而不能被100整除的年

    java 经典习题.doc

    1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 【程序3】 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和...

    java综合试题(面试题)

    3、在Java语言里,do-while语句是先执行循环体,然后再判断的循环条件。 ( ) 4、只有抽象类或接口中才能包含抽象方法。 ( ) 其他 8、StringBuffer类的对象包含的字符串不可以被修改。 ( ) 8.字符串 ”\’a\...

    java,产生一个8乘8的0、1矩阵,并判断每行、每列及主副对角线是否全为1或全为0

    java,产生一个8乘8的0、1矩阵,并判断每行、每列及主副对角线是否全为1或全为0

    java范例开发大全源代码

    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟) 2  1.1 理解Java 2  1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置...

    Java进制/时间/日期/字符串/流算法大全

    判断一个数字是奇数还是偶数 用Hibernate 实现分页 35 选7 彩票程序 获取GMT8 时间 中文乱码转换 Big5 字与Unicode 的互换 取得服务器当前的各种具体时间 用半角的特殊符号代替全角的特殊符号 数组和数组之间的转换...

    java范例开发大全

    第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java...

    Java谜题解惑 中文版CHM格式

    因为在所有的 int 数值中,有一半都是负数,而 isOdd 方法对于对所有负奇数的判断都会失败。在任何负整数上调用该方法都回返回 false ,不管该整数是偶数还是奇数。 这是 Java 对取余操作符(%)的定义所产生的后果...

Global site tag (gtag.js) - Google Analytics