交換兩個整型數各種方法總結

2021-06-25 16:33:56 字數 4307 閱讀 2948

交換兩個整型數是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 ...

交換兩個變數的值(多種方法)

通常,在剛學習的階段,我們的做法是引入乙個新的變數,借助它來完成兩個變數的交換。就像把兩杯水交換一樣,要再買乙個杯子 才能完成交換。這種演算法易於理解,特別適合幫助初學者了解電腦程式的特點,是賦值語句的經典應用。在實際軟體開發當中,此演算法簡單明瞭,不會產生歧義,便於程式設計師之間的交流,一般情況下...