不使用中间变量交换两个数(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;

}


《Android/OPhone开发完全讲义》(本书版权已输出到台湾)

 样章和目录下载

 

互动网

 
当当网 

卓越亚马逊

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

 样章下载

 互动网

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

发布

时间: 2024-10-26 01:05:34

不使用中间变量交换两个数(Java版)的相关文章

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

/*不交换中间变量交换两个数*/ #include <iostream> using namespace std; void Fun(int&x,int&y) { x=x+y; y=x-y; x=x-y; } int main() { int a=3,b=4; cout<<"交换前"<<endl<<"a="<<a<<"\t"<<"b=&q

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

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

不用中间变量交换两个数 swap(a,b);

#include <iostream> using namespace std; int main () { int a = 3; int b = 5; cout<<"a="<<a<<",b="<<b<<endl; a = a+b; ///a=7 b = a-b; ///b=3; a = a-b; ///a=5 cout<<"a="<<a<<

C++ 全排序算法中交换两个数

问题描述 C++ 全排序算法中交换两个数 #include<iostream> using namespace std; void swap(int& a, int& b){ a = a + b; b = a - b; a = a - b; } void swap1(int&a, int& b){ int temp = b; b = a; a = temp; } void perm(int a[], int i, int n){ if(i == n - 1){

异或交换两个数

 交换a和b: #include <iostream> using namespace std; int main() {     int a,b;     while(cin>>a>>b)     {         a=a^b;         b=b^a;         a=a^b;         cout<<a<<" "<<b<<endl;     }     return 0; }

swap() 交换两个数

#include <stdio.h> void swap(int *x, int *y)//传入指针 { int tmp; tmp = *x; *x = *y; *y = tmp; } int main() { int a = 3; int b = 5; printf("a = %d, b = %d\n", a, b); swap(&a, &b); printf("a = %d, b = %d\n", a, b); return 0; }

交换问题-两个数交换,但不加入第三个数,对于这样的做法具体栈中是怎么一个顺序?

问题描述 两个数交换,但不加入第三个数,对于这样的做法具体栈中是怎么一个顺序? 两个数交换,但不加入第三个数,对于 int num1 =1; int num2 =2; System.out.println("交换前---num1="+num1+" num2="+num2); num2 = num1 +(num1 = num2)*0; System.out.println("交换后---num1="+num1+" num2="+

Java 交换两个变量的数值实现方法_java

一.参数传递方法 为解决标题问题,首先介绍参数传递方法.目前各类程序设计语言的参数传递方法主要有三种: 1.按值传递 2.按引用传递 3.按指针传递 其中按值传递表示方法(函数)接收的是调用者提供的变量的拷贝,不改变参数的值:按引用传递表示方法(函数)接收的调用者提供的变量地址:按指针传递表示方法(函数)接收的是调用者提供的指针的拷贝,不改变指针的值和地址,但可以改变指针所指向的地址. 二.Java参数传递方法 Java提供的参数传递方法,很遗憾只有一种,按值传递.也就是说,方法得到的是所有参数

关于java两个数取模的问题

问题描述 关于java两个数取模的问题 public class Test { public static void main(String [] args) { int b=5a=3; System.out.println(a%b); } } 为什么输出结果为3,而不是0? 解决方案 3除以5,商0余3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 解决方案二: a%b = 3 a/b = 0. % 取模,也就是取余数,a = 3 b=5 a%b = 3%5=0