两个整数数字的交换引发的思考

在最初学习语言的时候,大家遇到最常见的一个问题就是数字的互换。

知道大家会说,这莫简单的问题还要写出来,你是真的无聊?

其实还真是无聊才写这篇文章,也许大家都知道我要用那网上做烂题的那样,写出那三个所谓的答案:

好吧,先上我们了解的三个方式代码吧。

public static void main(String[] args) {
		// TODO Auto-generated method stub
        //有关两个数交换的想法
		int a = 10, b = 5;
		//第一种 最常见的,应用第三方变量(根本)
		int temp = 0;
		temp = a;  a = b; b = temp;
		System.out.println("a = "+a+"  b = "+b);
		
		//第二种利用数学法
		 a = 10;  b = 5; //为了复原之前的值
		 a = a + b;
		 b = a - b;
		 a = a - b;
		 System.out.println("a = "+a+"  b = "+b);
		 
		 //第三种采用位运算来解决
		 a = 10;  b = 5; //为了复原之前的值
		 a = a ^ b;
		 b = a ^ b;
		 a = a ^ b;
		 System.out.println("a = "+a+"  b = "+b);
	}

运行的结果都是

a = 5  b = 10
a = 5  b = 10
a = 5  b = 10

先讲一遍吧,毕竟会有新人想去了解一下,第一个方式,就是大家最常见的两个整数互换的模式:

a = 10; b =5

temp = a;  // 执行这里是  temp  = 10, a = 10, b = 5

 a = b;   //  执行这里是   temp  = 10, a = 5, b = 5

b = temp; //  执行这里是   temp  = 10, a = 5, b = 10

这样就交换了使得 a = 5,b =10

第二个方法,采用数学的方式

a = a + b;// 执行这里是 a = 10 + 5    b = 5

b =a - b; // 执行这里是 a = 10 + 5   b = 10 + 5 -5 = 10

a = a - b;  // 执行这里是 a  = 10 +5 - 10 = 5,  b = 10

这样就转化过来了,其实我把里面的一个数替换掉,你会更加理解 

sum = a+b; b =  sum - b;  a = sum - b ;第三歩的时候,b的值变成了a的值,用总数减去的话就是对应b的值

第三个方法就是传统的为运算中的异或

先简单讲解一下基本的过程(考虑有些人还没有学到这里来) :

二进制数据    00000101 对应是数是5    二进制  00001010 对应的数据是10     

^ 为异或   它表明每一位的数据不同,就是1,相同就是0 

比如 1^0 与 0^1 它两个结果为 1

 0^0   1^1  结果是 0  

由这个现象,会出现 5^10 ^5,  其实等价于 5 ^ 5 ^10, 我们知道 5 与 5 的二进制数据是一样的所以每一位都是0

就变成 0^ 10, 由于一个数是0  只能出现   0^1  与  0^0 (这里是二进制数) 这两种情况  0^1结果为1  0^0为0.

可以看出后面一个数 数据没有任何的改变所以 0^ 10 结果为10,所以 ^ 可以去掉具有相同的偶数个数的数据

在看编程的第三个方案:
 a = 10;  b = 5; //为了复原之前的值
 a = a ^ b;    执行这里是 a = 10 ^ 5   b = 5
 b = a ^ b;    执行这里是 a = 10 ^ 5   b = 10 ^5 ^5 =10
 a = a ^ b;    执行这里是 a = 10 ^ 5 ^ 10 = 5   b = 10

于是便有了转换。

那么问题来了,写出其他的方式的办法,方法不局限。

也许有部分人会说:知道就好了呀。  部分会说,还有答案吗!!

也有部分会想出更多的答案。关键在于你想了没有。

其实第二种,与第三种的方式,完全可以理解成一种中的方式,虽然没有用第三个变量

完全可以理解成:

 z =  f(x,y);  这种形式(默认x y 为整形)  f 是对应的函数映射,且满足一次方(暂且,不一定正确)

多次方中有些可以满足,不是一定性质。如有大家其他想法可以在下面留言,看看自己的想法。其实满足z函数的唯一值,

单调函数都能满足。

满足这个性质后, 变量的值自要一个不变,z 可以赋值到其中一个变量上,然后根据函数的性质,对数据进行互换。

下面我来试试:

a = 10;  b = 5; //为了复原之前的值
a = a * b;
b = a/b;
a = a/b;
System.out.println("a = "+a+"  b = "+b);

       结果也是互换了数据,包括你可以利用其他位运算符,也可以达到数字互换的结果,答案不是唯一,有无限个解决方案。自己尝试去试试。

       补充(这里没有考虑到数据的,忽略了 0 1  的情况,这个例子只是提出的例子) 根据网友回答。

       写这篇文章是想告诉大家,思考是一件很棒的一件事,很多人喜欢尝试记住就好,于是他记住了3个解决方案。

        突然间让我想到了电影  银河补习班中的台词:“我希望我们的孩子,在将来遇到问题时候,想到的不只是 a b c d,而是能想到x y z”。多思考。静下来慢慢来,你会发现你真的很聪明。

       不知道这个文章能否带给你一些灵感,如果,你在学习上有自己的想法的时候,希望能能把它写下来,很多有趣是事情也会发生。

      加油!我们共同进步。

      文章写的很烂,只是为了表达自己的看法,里面很多没有去证明是否是对的,希望你能在下面提出来。这是第二篇胡思乱想系列。喜欢的朋友可以看看之前写的。

发布了26 篇原创文章 · 获赞 7 · 访问量 4309

猜你喜欢

转载自blog.csdn.net/weixin_42126427/article/details/104213548
今日推荐