`
seara
  • 浏览: 654513 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

阅读更多

本文为原创,如需转载,请注明作者和出处,谢谢!

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

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->static class Num
{
int a;
int b;
}
public static void swap1(Numnum)
{

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。
实际上,我们还可以使用“*”、“/”等符号来实现同样的效果,代码如下:

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->public static void swap2(Numnum)
{
num.a
= num.a * num.b;
num.b
= num.a / num.b;
num.a
= num.a / num.b;
}
public static void swap3(Numnum)
{
num.a
= num.a - num.b;
num.b
= num.a + num.b;
num.a
= num.b - num.a;
}

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

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->public static void swap4(Numnum)
{
// 不同符号
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。根本这种特性,可以有如下代码。

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->public static void swap5(Numnum)
{
num.a
= num.a ^ num.b;
num.b
= num.a ^ num.b;
num.a
= num.a ^ num.b;
}








《Android/OPhone开发完全讲义》(本书版权已输出到台湾)
样章和目录下载
互动网 当当网 卓越亚马逊

《人人都玩开心网:Ext JS+Android+SSH整合开发Web与移动SNS》
样章下载
互动网

乐博Android手机客户端(新浪微博) 发布

分享到:
评论

相关推荐

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

    在编程中,交换两个数值是常见的操作,但不使用中间变量进行交换可能需要一些巧妙的技巧。本文将探讨如何在Java中实现这一目标,主要基于数的中和原理,即通过特定的运算使得两个数相互抵消,从而达到交换的目的。 ...

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

    在Java中,我们可以使用异或(^)操作符来交换两个变量的值,因为异或两次相同的数等于零。具体步骤如下: ```java int x = 10; int y = 20; x = x ^ y; // 对x和y进行异或运算,得到它们的异或结果并赋给x y ...

    《Java编程语言:原理与范例》课后实验源代码.doc

    在第二章实验一中,我们看到一个关于变量交换的程序,要求不使用中间变量来交换两个变量的值。该程序使用了Java的基本数据类型和算术运算符来实现变量的交换。 该程序展示了Java中如何使用基本数据类型和算术运算符...

    java 交换两个数据的方法实例详解

    在Java编程语言中,交换两个数据是常见的操作,无论是在数组排序、列表操作还是其他算法中都可能遇到。本文将详细讲解两种交换两个数据的方法,并通过实例进行解析。 方法一:利用数组 数组是最基础的数据结构,...

    适合于初学者的JAVA基础练习题

    6. **变量交换**:不使用第三个变量交换两个整数i和j的值。Java提供了异或操作符`^`,可以用来交换两个数的值,因为`(a ^ b) ^ b = a`。 7. **兔子问题**:根据斐波那契数列计算兔子的数量。这是一个典型的动态规划...

    SlidingPuzzle JAVA程序

    在解决拼图的过程中,会涉及到数组元素的交换,比如使用`temp`作为中间变量进行两个相邻元素的互换。此外,可能还会用到数组的遍历,检查当前拼图是否达到目标状态。 ### 6. 状态判断与算法 解决滑动拼图通常涉及一...

    Java对象交换方法剖析.zip

    - Java 5及以上版本提供了`Integer`包装类,可以使用`compareTo()`或`exchange()`方法(Java 8引入)来交换两个`Integer`对象的值。 2. **引用类型交换**: - 引用交换相对简单,只需将两个引用互相赋值即可,...

    JAVA循环 练习题

    - **实现思路**:直接使用条件语句比较两个数,确定最大值和最小值后输出。 #### 7. 字符串读取统计 - **题目解析**:读取一串英文字符,统计其中的英文字母和空格数量。 - **实现思路**:使用while循环,每次读取...

    java程序设计之网络编程第二版课后习题答案

    此外,习题还展示了如何使用异或运算符(^)无中间变量地交换两个整数的值。 合法的标识符是程序中用于变量、类、方法等的名称,必须遵循特定规则,例如不能以数字开头,不能包含特殊字符或保留字,A选项中的"a=b...

    Java 排序大全排序大全

    它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 ```java public void BubbleSort(int[] L) { ...

    国开电大 Java语言程序设计 形考任务1-2答案.pdf

    8. **变量交换**:在Java中,交换两个变量的值通常需要一个临时变量,如题目中的`tmp`。执行代码后,`m`和`n`的值变为`160/50`。 9. **算术运算优先级**:整数除法会舍去小数部分,所以`29/3*3`的值是27,不考虑...

    iava解惑,深入剖析java

    在Java中,交换两个变量的值通常是通过中间变量或位运算实现的。不使用额外变量的交换方法是通过异或操作:`a = a ^ b; b = a ^ b; a = a ^ b;` 谜题8:Dos Equis 这个谜题可能与字符串操作有关,例如拼接、查找、...

    java算法,经典面试必备

    3. 不使用中间变量交换两个变量的值: 在这个例子中,通过一次乘法和两次除法实现了a和b的值互换。这种方法利用了算术运算的性质,避免了使用额外的中间变量。首先,a乘以b得到新的值并赋给a,然后用这个结果除以b...

    java面试题

    1. 从列表的第一个元素开始,比较相邻的两个元素。 2. 如果第一个元素大于第二个元素,则交换它们的位置。 3. 重复步骤 1 和 2,直到列表的末尾,此时最大的元素将位于正确的位置。 4. 除了最后一个元素,对剩余的...

    java基础独家版

    Java基础是学习任何Java应用开发的基石,涵盖了变量、数据类型、控制结构、类与对象、数组、异常处理、输入/输出(I/O)等多个核心概念。在这个“Java基础独家版”中,我们可以看到几个关键的Java编程知识点: 1. *...

    大数据必学Java基础(十六):赋值运算符

    在Java中,交换两个变量的值是常见的操作,但直接使用`=`会导致问题,如以下错误代码所示: ```java int num1 = 10; int num2 = 20; num1 = num2; // 此时num1 = 20, num2 = 20 num2 = num1; // num2仍然为20,两个...

    蓝点被必做的算法经典题java.c/c++

    - 交换两端的元素,然后逐步向中间移动指针。 - 直到两个指针相遇或交错,完成数组的逆序操作。 #### 程序28: 提取整数的指定位 - **目标**: 提取一个整数从右端开始的4~7位。 - **程序分析**: - 首先使整数...

    java基础要点总结学习java必看.pdf

    在交换两个变量的值时,通常有两种方法:一是使用中间变量,二是利用算术运算,例如加法、减法或异或。例如,交换两个整数`n`和`m`的值可以使用异或操作:`n = n ^ m; m = n ^ m; n = n ^ m;`。这种方法避免了使用...

Global site tag (gtag.js) - Google Analytics