交換兩個整型數是c/c++中最常見的操作。
實現這個操作的方法很多。
最基本的方法就是使用乙個臨時變數,具體的**如下:
int a,b;
int tmp;
tmp=a;
a=b;
b=tmp;
如果以函式的形式寫出來的話就是:
void swap(int *a,int *b)
在c++中,可以使用引用來實現的比較優雅:
void swap(int& a,int &b)
另外,還經常出現的一種情況是不使用臨時變數來交換兩個整型數,一般常見的方法有兩種:加法和異或運算,具體如下表所示:
void swap1(int& x,int& y)
void swap2(int &x,int &y)
void swap3(int& x,int& y)
x和y同號的情況下容易溢位
x和y異號的情況下容易溢位
左邊的兩種交換也存在問題就是整數的溢位。
還有一種情況就是輸入是swap(a,a)的情況。這樣的話就會出問題。
所以更嚴謹的做法如下:
void swap4(int &x,int &y)
else
}
void swap5(int &x,int &y)
void swap7(int &x,int &y)
引申:
在c++中支援模板操作,所以,可以利用這個寫乙個通用的swap操作:
template void swap ( t& a, t& b )
這個其實是c++標準模板庫中函式。該函式可以交換任意兩個型別:
// swap algorithm example
#include #include #include using namespace std;
int main ()
除此之外,在標準c++中string,vector,map,set等容器都是有swap函式的。
下面是一些簡單的例子:
// swap strings
#include #include using namespace std;
main ()
//
swap vectors
#include
#include
using
namespace std;
int main ()
//swap maps
#include
#include
using
namespace std;
int main ()
foo contains:
a =>
11b =>
22c =>
33bar contains:
x =>
100y =>
200//
swap sets
#include
#include <
set>
using
namespace std;
main ()
;
set<
int> first (myints,myints+
3);
//10,12,75
set<
int> second (myints+
3,myints+
6);
//20,25,32
set<
int>::iterator it;
first.swap(second);
cout <
"first contains:
";
for (it=first.begin(); it!=first.end(); it++) cout <
""<
cout <
"\nsecond contains:
";
for (it=second.begin(); it!=second.end(); it++) cout <
""<
cout <
return
0;
}
first contains:
202532
second contains:
101275
另外,還有不使用臨時變數交換n個整型數的操作,
有n(n>=2)個變數,不使用臨時變數,如何順次交換它們的值?能否只用一條語句實現?如
+---+---+---+---+---+
| a | b | c | d | e |
+---+---+---+---+---+
| 1 | 2 | 3 | 4 | 5 |
+---+---+---+---+---+
要把它變為
+---+---+---+---+---+
| a | b | c | d | e |
+---+---+---+---+---+
| 2 | 3 | 4 | 5 | 1 |
+---+---+---+---+---+
怎樣實現?
不用臨時變數交換兩個數的值
》。用c++寫函式如下:
int
&swap
(int
&a,int
&b)然後可以把**優化為:
int
&swap
(int
&a,int
&b)繼續優化,把三句壓縮為一句,如下:
int
&swap
(int
&a,int
&b)還可再優化,如下:
int
&swap
(int
&a,int
&b)現在來順次交換5個變數的值,如下:
swap
(a, b)
;//返回b
swap
(b, c)
;//返回c
swap
(c, d)
;//返回d
swap
(d, e)
;既然有返回值,那麼可以寫成鏈式的,如下:
swap
(a, b)
;//返回b
swap
(swap
(a, b)
, c)
;//返回c
swap
(swap
(swap
(a, b)
, c)
, d)
;//返回d
swap
(swap
(swap
(swap
(a, b)
, c)
, d)
, e)
;現在,讓我們來把swap函式依次用相應的函式體替換掉,如下:
e ^= d ^= e ^=
swap
(swap
(swap
(a, b)
, c)
, d)
;e ^= d ^= e ^= d ^= c ^= d ^=
swap
(swap
(a, b)
, c)
;e ^= d ^= e ^= d ^= c ^= d ^= c ^= b ^= c ^=
swap
(a, b)
;e ^= d ^= e ^= d ^= c ^= d ^= c ^= b ^= c ^= b ^= a ^= b ^= a;
好了,最後乙個語句就實現了順次交換五個變數的值,寫程式驗證如下:
#include
#define print(a) do
while (
0)int main()
Java中交換兩個數的各種方法
給兩個數a和b,然後交換a和b的值。方式一 通過臨時變了存放交換 int a 2 int b 3 system.out.println a a b b int temp a a b b temp system.out.println a a b b 方式二 通過加減計算交換 int a 2 int ...
五種方法交換兩個整數
備註 int 範圍 2 31 2 31 1 即 2147483648 2147483647 long long 範圍 2 63 2 63 1 即 9223372036854775808 9223372036854775807 第一種方法 三變數法 特點 通用性強,簡潔易懂 includeusing ...
交換兩個變數的值(多種方法)
通常,在剛學習的階段,我們的做法是引入乙個新的變數,借助它來完成兩個變數的交換。就像把兩杯水交換一樣,要再買乙個杯子 才能完成交換。這種演算法易於理解,特別適合幫助初學者了解電腦程式的特點,是賦值語句的經典應用。在實際軟體開發當中,此演算法簡單明瞭,不會產生歧義,便於程式設計師之間的交流,一般情況下...