c語言中不需要中間變數就能實現兩個數交換的幾種演算法

2021-07-25 11:08:01 字數 1362 閱讀 5462

第一類方法也是常用的方法,通過多次的數值計算來完成交換,到現在知道的有下面三種:

(1)加減法。

a = a + b;

b = a - b;

a = a - b;

該方法可以交換整型和浮點型數值的變數,但在處理浮點型的時候有可能出現精度的損失,例如對資料:

a = 3.123456

b = 1234567.000000

交換後各變數值變為:

a = 1234567.000000

b = 3.125000

很明顯,原來a的值在交換給b的過程中發生了精度損失。

(2)乘除法。

a = a * b;

b = a / b;

a = a / b;

乘除法更像是加減法向乘除運算的對映,它與加減法類似:可以處理整型和浮點型變數,但在處理浮點型變數時也存

在精度損失問題。而且乘除法比加減法要多一條約束:b必不為0。

可能經驗上的某種直覺告訴我們:加減法和乘除法可能會溢位,而且乘除的溢位會特別嚴重。其實不然,採用這兩種

方法都不會溢位。以加減法為例,第一步的加運算可能會造成溢位,但它所造成的溢位會在後邊的減運算中被溢位回來。 

(3)異或法。

a ^= b;       //a=a^b

b ^= a;      //b=b^(a^b)=b^a^b=b^b^a=0^a=a

a ^= b;     //a=(a^b)^a=a^b^a=a^a^b=0^b=b

異或法可以完成對整型變數的交換,對於浮點型變數它無法完成交換。

第二類方法更像是玩了乙個文字遊戲,此種方法採用了在**中嵌入彙編**的方法避免了臨時變數的引入,但究其

本質還是會使用額外的儲存空間。此種方法可以有很多種,下邊列出幾種:

(1)使用xchg指令,這也是比較直觀、容易想到的方法,因為xchg指令的功能就是交換源運算元和目的運算元的

值,這裡要使用額外暫存器來暫存變數。內嵌彙編**如下:

_asm

(2)使用額外的棧。這裡使用反向的出棧順序來完成交換。內嵌**有如下兩種形式:

_asm

另一種形式:

_asm push a

a = b;

_asm pop a

(3)使用mov指令。這種方法使用額外暫存器來暫存乙個變數的值。

_asm mov eax,a

a = b;

_asm mov b,eax

其實第二類方法並不合格,它雖然沒有顯式的使用臨時變數,但還是會用到額外的存貯空間。不過也不能說沒有必要

掌握,從實用的角度看還是很「有用」的。如果遇到有公司出筆面試題要求不用異或,加減,乘除法等完成兩個數的交

換,就可以使用這種方法,當時對知識的擴充套件。

C語言中交換兩個數的方法總結

temp a a b b temp 這種方法實際上就是先把a b的結果暫時先儲存在變數a中,然後通過這改變後的a和原始的b進行減法就可以得到交換後的b,但是這種方法有乙個缺陷,就是a和b都是int型別,a b的結果可以越界。a a b b a b a a b 這種方法和方法2類似,只是用a b代替a...

C語言中交換兩個變數的值

在c語言中,要交換兩個變數的值,對於不同的人,可能會有不同的方法。對於初學者來說,可能是這樣。void swap int x,int y 但是,c語言中的函式呼叫採用的值傳遞,因此在主函式中呼叫該swap函式顯然無法交換兩個變數的值。當然,對於很多使用c語言的人來說,不會犯上面的錯誤,會這麼寫交換函...

18 不使用中間變數,實現兩個數的交換 JAVA

1 普通的方法,使用乙個中間變數temp,可以使用引用 void swap int a,int b 輸出結果為 4 4 不使用中間變數,使用加減的方法 void swap int a,int b a a b b a b a a b 以上三句等於 a a b a b 5 不使用中間變數,使用乘除的方法...