我的第一个博客,我想先从最简单的开始吧。我是一个学生,今天给大家带来的是用C语言实现两个数的数值交换,如果大家有什么问题或建议,可以给我留言。我们一起讨论一起学习,谢谢!
关于数值交换问题,我的解决方案有三种:
(一)设置第三个变量帮助进行数值交换。
思路:就像两个水杯中都盛满了液体,A杯中放的是红色液体,B杯中放的蓝色液体,你需要一个空杯子C,将A中的液体倒进C中,这样A杯子空了,才能将B杯子中的液体倒入A中,最后将C杯子中的液体倒入B杯子中。最后A杯子中的液体是蓝色(来自B杯子),B杯子中液体是红色(来自A)。
#include<stdio.h>
int main()
{
int a = 9, b = 14, c = 0; //交换a和b的值,设置新的变量c,并初始化为0
c = a; // c = 9 将a的值先给了c
a = b; // a = 14 b的值给了a
b = c; // b = 9 c的值给了b
printf("%d%d",a,b); // a = 14,b = 9
return 0;
}
以上是第一种方法完成了数值交换。
(二)通过加法或者乘法进行数值交换
之前我们设置了第三个变量,从这个方法开始,我们可以不再设置新的变量。
思路:我们以加法为例进行数值交换,假设我们交换a和b的值,a = 9, b = 14,首先我们将a和b的值加起来 a + b = 23,之后将23这个值赋给a(即a + b),所以现在a = 23,那么用23减去b的值,就是a的值,但我们需要将a的值给b,所以b = a - b(即b = (a + b) - b = a),将a的值给了b,最后用23减去b的新值,成为a的值(即a = 23 - b)。减去b的新值,成为a的值(即a = 23 - b)。
#include<stdio.h>
int main()
{
int a = 9,b = 14;
a = a + b; // 等号左边a值为23,等号右边的a值为9,此语句结束后a的值为23
b = a - b; // 等号右边a值为23,b为原值14,23-14 =9,给了等号左边的b(原来的a值)
a = a - b; // 等号右边a值为23,b值为12,23-9=14,赋给等号左边的a(原来的b值)
printf("%d %d",a,b); // a = 14, b = 9
return 0;
}
以上是用加法进行数值交换,用乘法和加法的思路是一样的,只是将程序中“+”号改为“*”号,将“-”号改为“/”号。不过此方法使用时应注意,如果数值过大,可能会溢出。
(三)通过异或的方法进行数值交换
思路:首先让我们先了解一下异或
a = 9, b = 14
a的值为9,那么我们将它的二进制编码写出来是1001,b的值是14,它对应的二进制编码是1110,异或就是将两个数的二进制编码的对应的位进行对比,不相同的输出1,相同的输出0。
a = 9 1 0 0 1
b = 14 1 1 1 0
对比结果为 0 1 1 1
让我们记住 0 1 1 1这个数字。
之后我们用a的值9对应的二进制码 1 0 0 1去跟0 1 1 1进行异或:
a = 9 1 0 0 1
0 1 1 1
对比结果为 1 1 1 0 (即就是b的值)
同理我们用b的值14对应的二进制码 1 1 1 0去跟0 1 1 1进行异或:
b = 14 1 1 1 0
0 1 1 1
对比结果为 1 0 0 1 (即就是a的值)
相信我们看出来了规律,就是a和b的值的二进制码异或出来的那个数字,a和那个数字异或得到b,b和那个数字异或得到a。
#include<stdio.h>
int main()
{
int a = 9,b = 14; // a 1001(9) b 1110(14)
a = a^b; // a = 1001 ^ 1110 = 0111
b = a^b; // b = 0111 ^ 1110 = 1001(9)
a = a^b; // a = 0111 ^ 1001 = 1110(14)
printf("%d %d",a,b);
return 0;
}
以上是通过异或的方法进行数值交换,此方法解决了第二个方法可能由于数字过大而溢出的问题,不过此方法的效率比较低。
以上是进行数值交换的三种方法,如果大家有什么其他好的方法,我们可以一起讨论学习,谢谢!
转载于:https://blog.51cto.com/chrisapril/1738418