`
jimmy1990
  • 浏览: 4825 次
  • 性别: Icon_minigender_1
  • 来自: 福州
最近访客 更多访客>>
社区版块
存档分类
最新评论

java不使用中间变量交换两个数

阅读更多
在程序中实现交换两个数的功能并不复杂,但如果不使用中间变量,就需要动一下脑筋。在本文介绍了两个方法(其实原理都是一个)。其基本原理就是数的中和。也就是说,通过某种运算(二元运算)将a和b两个数变成一个数,并保存在其中一个变量中。然后再通过同样的运算符将a或b中和掉。这样实际上是利用了a或b本身作为了中间变量。
    先看第一个算法。

static   class  Num
{
     int  a;
     int  b;
}
public   static   void  swap1(Num num)
{

    num.a  =  num.a  +  num.b;
    num.b  =  num.a  -  num.b;
    num.a  =  num.a  -  num.b;
}

    上面代码通过“+”运算符将a和b的运算结果赋给了a(这时a是中间变量)。然后再计算b,这时a的值已经是(a+b)了,因此,a再减b就是原来的a。 而这时b已经是原来的a了,因此,再用运算后的a(实际上是a+b)减运算后的b(实际上是原来的a),就是原来的b了,最后将这个b赋值给a。
    实际上,我们还可以使用“*”、“/”等符号来实现同样的效果,代码如下:


public   static   void  swap2(Num num)
{
    num.a  =  num.a  *  num.b;
    num.b  =  num.a  /  num.b;
    num.a  =  num.a  /  num.b;
}
public   static   void  swap3(Num num)
{
    num.a  =  num.a  -  num.b;
    num.b  =  num.a  +  num.b;
    num.a  =  num.b  -  num.a;
}

    上面代码在Java中没有什么问题(但使用“/”时,分母和分子不能为0)。就算溢出也会得到正确的结果,但有某些语言中(如C语言),可能会抛出溢出错误,不了避免这种错误。可以加判断,代码如下:

public   static   void  swap4(Num num)
{
     //  不同符号
     if  (num.a  *  num.b  <=   0 )
    {
        num.a  =  num.a  +  num.b;
        num.b  =  num.a  -  num.b;
        num.a  =  num.a  -  num.b;
    }
     else
    {

        num.a  =  num.a  -  num.b;
        num.b  =  num.a  +  num.b;
        num.a  =  num.b  -  num.a;
    }
}
    当然,我们还有更好的方法,就是使用异或运算符,我们知道,任何数与0异或后仍然为它本身,两个相同的数异或后为0。根本这种特性,可以有如下代码。

public   static   void  swap5(Num num)
{
    num.a  =  num.a  ^  num.b;
    num.b  =  num.a  ^  num.b;
    num.a  =  num.a  ^  num.b;
}
0
2
分享到:
评论

相关推荐

    Java不使用中间变量交换两个数

    在程序中实现交换两个数的功能并不复杂,但如果不使用中间变量,需要动一下脑筋。在本文介绍了两个方法(其实原理都是一个)。其基本原理是数的中和。也是说,通过某种运算(二元运算)将a和b两个数变成一个数,并...

    Java实现两个整数交换

    本人上传的第一个作品,超级简单,两个整数交换的经典例子,是在一个类中实现的,给JAVA初学者一个借鉴。希望在技术上共同进步

    两个数字的交换,三种方法

    方法一:使用第三方变量交换数据; 方法二:使用加减法,并且不使用第三方变量 思路:a加上b的和,减去a,就等于b,再用这个数减去b,就等于a。 方法三:使用异或方法交换,并且不使用第三方变量 ...

    Java开发技术大全(500个源代码).

    trySwap.java 试图交换两个形参的值 useOnlyTest.java 创建多个对象,演示this的作用 useStaticBolck.java 使用静态块 useStVar.java 使用静态成员变量 第4章 示例描述:本章学习继承与多态。 absClass.java ...

    Python 函数的返回值-03-交换两个变量的值

    Python解释器易于扩展,可以使用C语言或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器...

    java如何交换这两个变量的值方法介绍

    在编程中可能会使用java来完成两个变量值的交换,本文将介绍如何解决此类问题,希望可以帮助您

    Python变量的输入输出-提出问题—从控制台输入数字需要两个变量处理

    Python解释器易于扩展,可以使用C语言或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器...

    java基础编程题源码.zip

    1.定义两个int 类型的变量 a 和 b ,分别打印输出a与b的‘加/减/乘/除/取余’的结果。2.定义一个int类型的变量 i ,输出这个...7.任意定义两个int类型的变量a=13和b=7,交换a和b的值,并打印交换后的结果(两种方法)

    Java-Interview-Programs:带有完整源代码的Java核心项目-java project source code

    交换两个数字,而无需使用第三个变量方法1。 交换两个数字,而无需使用第三个变量方法2。 交换两个数字,而无需使用第三个变量方法3。 如何检查给定的数字在Java中是正数还是负数? 编写一个Java程序来查找给定...

    java 面试题 总结

    JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变...

    学通Java的24堂课

    1.5.1 情景应用1——计算两个整数的和 19 1.5.2 情景应用2——输出当前日期 19 1.5.3 情景应用3——在控制台接收用户输入数字 20 1.5.4 情景应用4——计算用户输入数字的乘积 21 1.6 自我测试 22 1.7 行动指南 ...

    第4章-Java面向对象程序设计-Java语言GUI程序设计-赵满来-清华大学出版社.pptx

    例4.1 编写方法swap交换两个int型变量的值,并显示交换前后形参和实参的值。 第4章-Java面向对象程序设计-Java语言GUI程序设计-赵满来-清华大学出版社全文共51页,当前为第5页。 引用类型参数,相对应的实参和形参...

    跟我学Java面向对象程序设计技术及应用——应用冒泡排序算法实现数组元素排序的Java程序实现示例.pdf

    在百科中的定义如下(如 下示图显示具体的定义):它重复地走访过要排序的元素列,依次比较两个相邻的元素,如 果顺序(如从大到小、首字母从 Z 到 A)错误就把他们交换过来。走访元素的工作是重复地 进行直到没有...

    Java内存模型案例讲解.docx

    在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步,通信指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。 Java语言的并发采用的是共享...

    超级有影响力霸气的Java面试题大全文档

     JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要...

    java异或-Java异或运算总结.pdf

    例⼀:在不引⼊第三个变量的情况下,两个变量的值(整数) //交换a、b的值 例⼆:判断奇数偶数更简单更⾼效的做法 //这个实际考的不多, 太简单 //思路:奇数的⼆进制最低为⼀定为1,偶数的⼆进制最低位⼀定为0, a^...

    java的传值与传引用详解

     传值还是传引用的问题,到此已经算是解决了,但是我们仍然不能解决这样一个问题:如果我有两个 int 型的变量 a 和 b,我想写一个方法来交换它们的值,应该怎么办?  结论很让人失望——没有办法!因此,我们只能...

    java web开发技术大全

    除此之外,《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》还提供了两个完整的实例来讲解开发SSH的详细步骤和方法。通过对这两个实例的学习,读者可以对SSH开发模式有更透彻地理解和认识。SSH是...

    java web技术开发大全(最全最新)

    除此之外,《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》还提供了两个完整的实例来讲解开发SSH的详细步骤和方法。通过对这两个实例的学习,读者可以对SSH开发模式有更透彻地理解和认识。SSH是...

Global site tag (gtag.js) - Google Analytics