(前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 這種演算法易於理解,特別適合幫助初學者了解電腦程式的特...