我的第一个博客,我想先从最简单的开始吧。我是一个学生,今天给大家带来的是用C语言实现两个数的数值交换,如果大家有什么问题或建议,可以给我留言。我们一起讨论一起学习,谢谢!j_0002.gif

    关于数值交换问题,我的解决方案有三种:

    (一)设置第三个变量帮助进行数值交换。

     思路:就像两个水杯中都盛满了液体,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;
}

    以上是通过异或的方法进行数值交换,此方法解决了第二个方法可能由于数字过大而溢出的问题,不过此方法的效率比较低。

    以上是进行数值交换的三种方法,如果大家有什么其他好的方法,我们可以一起讨论学习,谢谢!