交換兩個變數的值,不使用第三變數的6種方法

2021-07-15 10:16:20 字數 2094 閱讀 5897

(前4種為常見演算法,以下**程式語言均以c++例舉,數值型別以int例舉)

//方法1:加減互逆運算

int a=5,b=3;//需要交換的兩個變數

a=a+b;b=a-b;a=a-b;

/*方法2:乘除互逆運算

*(因除法可能獲得不了精確結果,且比加減法易進製,容易溢位;所以不推薦此種)*/

int c=5,d=3;//需要交換的兩個變數

c=c*d;

d=c/d;

c=c/d;

總結:

優點:無需程式設計基礎,就可理解

缺點:僅限於數字,運算的溢位雖可糾正,但不安全

特點:理論上互逆運算均可完成算術交換變數值,但在不同的程式語言,對同一運算的處理略有不同,推薦用加減法,更保險

int a=5,b=3

;//需要交換的兩個變數

a=a^b;

b=a^b;

a=a^b;

a^b—異或:將兩個數按二進位制位運算,在同一位上,相同則為0,不同則為1;eg:1^0=1; 0^0=1; 1^1=0

總結

優點:適應廣(可用於所有的基本型別,eg:字串),運算安全,不會溢位

特點:乙個變數 與同乙個值 異或兩次,值不變

int *a,*b; 

*a=new

int(10);

*b=new

int(20); //&a=0x00001000h,&b=0x00001200h

a=(int*)(b-a); //&a=0x00000200h,&b=0x00001200h

b=(int*)(b-a); //&a=0x00000200h,&b=0x00001000h

a=(int*)(b+int(a)); //&a=0x00001200h,&b=0x00001000h

當b-a<0,系統自動採用補碼的形式表示負的位移,由此會產生錯誤,以下為改進

if(aint*)(b-a);

a=(int*)(b+(int(a)&0x0000ffff));

}else

總結

優點:適應面全(適應於大型別,eg:自定義類,結構),效率高(因值在記憶體中沒有移動,所以速度快,尤其是大型別)

缺點:操作繁多,難理解

int a=5,b=3;//需要交換的兩個變數

stack s;

push(s,a);//將a存入棧s

push(s,b);

a=pop(s);//取出棧s中最後乙個元素

b=pop(s);

棧的特點:先進後出

string a="str1",b="str2"

;//需要交換的兩個變數

int blen=b.length;

a=b+a

;b=a.substring(blen);//擷取blen位置開始到結尾的字串

a=a.substring(0,blen);//擷取從0開始到blen-1位置的字串

總結:

優點:適應廣(可將其他基本型別轉換為字串,交換成功後再換回來)

缺點:操作繁多

特點:利用了字串的擷取,合成

將某個運算子過載成具有交換值的功能

int a=5,b=3;//需要交換的兩個變數

int temp;//臨時變數

temp=a;

a=b;

b=temp;

總結:因標準演算法可以交換任何型別的值,所以通常是實際開發應用中的首選。

一.作業系統把記憶體分類成:

a.系統**/資料區

b.應用程式**/資料區

c.堆疊區

d.全域性資料區等

二.在編譯源程式時:

常量、全域性變數等都放入全域性資料區

區域性變數、動態變數則放入堆疊區

交換兩個變數的值,不使用第三個變數

通常我們的做法是 尤其是在學習階段 定義乙個新的變數,借助它完成交換。如下 int a,b a 10 b 15 int t t a a b b t 這種演算法易於理解,特別適合幫助初學者了解電腦程式的特點,是賦值語句的經典應用。在實際軟體開發當中,此演算法簡單明瞭,不會產生歧義,便於程式設計師之間的...

不使用第三方變數交換兩個變數的值

這需要進行位操作,必較麻煩的,在學習程式語言和進行程式設計的時候,交換兩個變數的值是經常要使用的。通常我們的做法是 尤其是在學習階段 定義乙個新的變數,借助它完成交換。如下 int a,b a 10 b 15 int t t a a b b t 這種演算法易於理解,特別適合幫助初學者了解電腦程式的特...

不使用第三方變數交換兩個變數的值

這需要進行位操作,必較麻煩的,在學習程式語言和進行程式設計的時候,交換兩個變數的值是經常要使用的。通常我們的做法是 尤其是在學習階段 定義乙個新的變數,借助它完成交換。如下 int a,b a 10 b 15 int t t a a b b t 這種演算法易於理解,特別適合幫助初學者了解電腦程式的特...