多方法实现 swap 2 个 int 变量的值
来源:互联网 发布:彩票合买代购源码 编辑:程序博客网 时间:2024/06/08 02:00
最常用方法是用临时变量保存备份值
void swap(int &x, int &y){ int temp = x; x = y; y = temp;}
不使用临时变量,方法是:按位异或 及 四则运算实现
#include <iostream>#include <limits>using namespace std;void swap(int &x, int &y){ x ^= y; y = x ^ y; x = x ^ y;}void swap1(int &x, int &y){ x = x + y; // 即使溢出,结果仍正确 y = x - y; x = x - y;}void swap2(int &x, int &y){ x = x - y; // x - y 丢失数据 y = x + y; x = x + y;}void swap3(int &x, int &y){ x = x * y; // x*y 可能溢出 y = x / y; x = x / y;}void swap4(int &x, int &y){ x = y / x; y = y / x; // x = 0 出错 x = x * y;} int main(void){ int x = numeric_limits<int>::max(); int y = numeric_limits<int>::max()-1; // x = 1, y = 2; cout << "原值" << x << " " << y << endl; swap(x, y); swap(x, y); cout << "swap 异或:"; cout << x << " " << y << endl; swap1(x, y); swap1(x, y); cout << "swap 加:"; cout << x << " " << y << endl; swap2(x, y); swap2(x, y); cout << "swap 减:"; cout << x << " " << y << endl; // swap3(x, y); // cout << "swap 乘:"; // cout << x << " " << y << endl; // swap4(x, y); // cout << "swap 除:"; // cout << x << " " << y << endl; cout << "===========" << endl; x = numeric_limits<int>::min(); y = numeric_limits<int>::min()+1; cout << "原值" << x << " " << y << endl; swap(x, y); swap(x, y); cout << "swap 异或:"; cout << x << " " << y << endl; swap1(x, y); swap1(x, y); cout << "swap 加:"; cout << x << " " << y << endl; swap2(x, y); swap2(x, y); cout << "swap 减:"; cout << x << " " << y << endl;}
运行结果为:
原值2147483647 2147483646以下交换使用一种方法均进行交换2次,如仍输出原值,结果正确swap 异或:2147483647 2147483646swap 加:2147483647 2147483646swap 减:-2147483647 -2147483648===========原值-2147483648 -2147483647swap 异或:-2147483648 -2147483647swap 加:-2147483648 -2147483647swap 减:2147483646 2147483647[Finished in 0.4s]
由以上结果分析,只有通过按位异或的方式和用一个变量保存和(虽然溢出但结果正确)的方式能正确实现交换。
// 异或void swap(int &x, int &y){ x ^= y; y = x ^ y; x = x ^ y;}// 用 x 保存 x+y 的和void swap1(int &x, int &y){ x = x + y; y = x - y; x = x - y;}
其他方式,如通过保存2个变量的差/积/商,对于某些数据可能输出正确结果,但是对于可能溢出的数据,不能实现正确的交换。
结论:
除了使用临时变量实现交换的方法外,还可以用按位异或 和 用其中一个变量保存和的形式实现交换2个整型变量。
0 0
- 多方法实现 swap 2 个 int 变量的值
- 输入a,b,c三个整数,按由大到小顺序输出。(用3个指针变量指向3个整形变量,然后用swap函数来实现互换3个整型变量的值)
- 输入a,b,c三个整数,按由大到小顺序输出。(用3个指针变量指向3个整形变量,然后用swap函数来实现互换3个整型变量的值)
- 关于2个int变量交换的问题
- 不使用第三个变量交换两个int类型变量的值
- C#复习_不使用第三个变量交换两个int类型变量的值
- 不实用第三个临时变量,交换两个int变量的值
- 有两个int型变量a,b,在不使用第三个变量的情况下实现a,b互换
- 不用中间变量实现交换swap的问题
- Struts2多方法的Action
- 不用第三个变量实现交换两个变量的值
- int swap
- 面向对象多方法2
- java中如何实现swap(int a,int b)
- 04.多方法交换x与y的值
- sql多方法实现行转列demo
- sql多方法实现列转行
- dispatch多方法实现连续动画
- poj 3278 Catch That Cow(经典bfs)
- ftok () 函数介绍
- 动态规划之合唱队形问题(最长递增子序列变形)
- 队列 的理解
- 再次写给我们这些浮躁的程序员
- 多方法实现 swap 2 个 int 变量的值
- 51nod 1264 线段相交(判线段相交 包括端点和部分重合)
- linux 线程 进程经典文章
- 偏远的高新区
- UICollectionView 和 UIKit
- 背包问题 递归思路
- 蛋疼
- HDU 2476 String painter(区间DP)
- Ubuntu下安装ShadowSocks Server和ShadowSocks Client