用多种方法交换两个数的值(转载)

 今天上了C语言课,老师讲了有关交换两个数的问题。课后,经过自己的思考和总结,我得出了以下几种方法。虽然这个问题的方法还有很多,但我目前只了解到了这五种方法,希望大家多提建议和意见。其他的方法待补充奥。。。

法一:

  大家最容易想的方法,首先设一个临时变量,利用临时变量将两个数交换。下面是实现它的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
int  main()
{
   int  num1=5,num2=10,tmp=0;
   printf ( "before:\n" );
   printf ( "num1=%d\num2=%d\n" ,num1,num2);
   tmp=num1;
   num1=num2;
   num2=tmp;
   printf ( "after:\n" );
   printf ( "num1=%d\num2=%d\n" ,num1,num2);
   return  0;
}

法二:利用指针实现,这种方法效率比较高。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
  void  swap( int * p1,  int  *p2)
  {
    int  tmp = *p1;
      *p1 = *p2;
      *p2 = tmp;
  }
  int  main()
  {
   int  num1 = 5;
   int  num2 = 10;
   int  tmp = 0;
   printf ( "before:\n" );
   printf ( "num1=%d\num2=%d\n" ,num1,num2);
   swap(&num1,&num2);
   printf ( "after:\n" );
   printf ( "num1=%d\num2=%d\n" ,num1,num2);
   return  0;
  }

法三:可以不用设置临时变量的方法,利用加减法实现,但是可能会出现溢出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
  int  main()
  {
   int  num1 = 5;
   int  num2 = 10;
   printf ( "before:\n" );
   printf ( "num1=%d\num2=%d\n" ,num1,num2);
   num1 = num1+num2;
   num2 = num1-num2;
   num1 = num1-num2;
   printf ( "after:\n" );
   printf ( "num1=%d\num2=%d\n" ,num1,num2);
   return  0;
  }

法四:利用乘除实现。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
  int  main()
  {
   int  num1 = 5;
   int  num2 = 10;
   printf ( "before:\n" );
   printf ( "num1=%d\num2=%d\n" ,num1,num2);
   num1 = num1*num2;
   num2 = num1/num2;
   num1 = num1/num2;
   printf ( "after:\n" );
   printf ( "num1=%d\num2=%d\n" ,num1,num2);
   return  0;
  }

法五:利用异或运算实现,但这个方法效率比较低。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
  int  main()
  {
   int  num1 = 5;
   int  num2 = 10;
   printf ( "before:\n" );
   printf ( "num1=%d\num2=%d\n" ,num1,num2);
   num1 = num1^num2;
     num2 = num1^num2;
     num1 = num1^num2;
   printf ( "after:\n" );
   printf ( "num1=%d\num2=%d\n" ,num1,num2);
   return  0;
  }

 今天就总结到这里吧。希望对大家有帮助。

本文出自 “10912110” 博客,请务必保留此出处http://10922110.blog.51cto.com/10912110/1717643

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值