在最初学习语言的时候,大家遇到最常见的一个问题就是数字的互换。
知道大家会说,这莫简单的问题还要写出来,你是真的无聊?
其实还真是无聊才写这篇文章,也许大家都知道我要用那网上做烂题的那样,写出那三个所谓的答案:
好吧,先上我们了解的三个方式代码吧。
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”。多思考。静下来慢慢来,你会发现你真的很聪明。
不知道这个文章能否带给你一些灵感,如果,你在学习上有自己的想法的时候,希望能能把它写下来,很多有趣是事情也会发生。
加油!我们共同进步。
文章写的很烂,只是为了表达自己的看法,里面很多没有去证明是否是对的,希望你能在下面提出来。这是第二篇胡思乱想系列。喜欢的朋友可以看看之前写的。