對於c語言中交換兩個數的方法,目
前大體上有這麼5種:
1:直接利用中間變數進行交換;
3:將兩個需要交換的數進行加減運算進行交換;
注:因c語言有浮點數之分,不可以認為乘除也可進行交換。
4:將兩個數進行亦或運算,也可以實現交換兩個數的目的;
5:對兩個數進行位操作,也可以實現交換兩個數的目的。
接下來我將對後面三種進行分析:
前面兩種太過常見,在此不做說明:
第三種:加減交換
將兩個數之和賦值給第乙個數,然後用新第乙個數減去第二個數得到舊第乙個數,並賦值給第二個數
,再用新第乙個數減去新第二個數(舊第乙個數)得到舊第二個數,並賦值給第乙個數,在此,實現
兩個數的交換,**如下:
1 #include2注意:此法使用缺陷3 intmain()
當需要交換的兩個數是指向同一下標的陣列元素,那麼此時,此法失效。
諸君請看:
1 #include2此外,使用此法時應注意兩個數之和不能超過所定義的型別所能表達的最大數,不然也將交換失敗3int main();
5int i=2,j=2;
6 a[i] += a[j]; //
因為i=j;所以此時a[i]=a[j]=2[i];
7 a[j] = a[i] - a[j];//
由上知,此時a[i]=a[j]=0;
8 a[i] = a[i] - a[j];//
此時兩者均為0;交換失敗
9 return 0;
10 }
第四種:異或運算進行交換
在此,我先說一下異或運算的原理:兩個數做異或運算,將兩個數化為二進位制,逐位比較,相同者得0,不同者得1;具體如下:
0 1 0 1 1 0 0 1
1 0 0 1 0 1 0 0
運算得 1 1 0 0 1 1 0 1
0 1 0 1 1 0 0 1
與第乙個數 至此感悟,**如下:
運算得 1 0 0 1 0 1 0 0
1 #include2注:和上一方法一樣,此法在對陣列使用時也受到相同的限制,但只需在對陣列使用之前做乙個,判斷確保指向的不是同乙個數,3int main()
那麼我覺得這種方法應是最簡單快捷的。
第五種:位運算進行交換
該方法也是基於二進位制進行運算
比如 5>>1 表示將5右移一位 --> 即 5的二進位制 0 0 0 0 0 1 0 1 右移一位得 0 0 0 0 0 0 1 0 原本末尾的1被移走,高位補0;左移同理
注意:因右邊是資料的最低位,所以當右移出去後,再左移是不能恢復到原來的數字的,但左移不同,左邊剩下的高位都為0,都是存在的,當你的數
字不足夠大時,左移之後是還可以通過右移恢復原數的
當想使用位運算交換兩個數的時,應先對每個數實際二進位制位數做簡單估測,再確定所移動位數,下面為交換兩個數的例項
1 #include2注:上述**中的&運算子運算原理和亦或相似,這個是如果兩個都為1,則為1,否則為0;3int main()
當用此方法進行交換兩個數時,一是兩個 數的大小 比第三種方法還受限制,而且所移的位數不好確定,不推薦使用
第一次寫部落格,我知道肯定毛病頗多,望各位大佬口下留情,手下留情,多多指點;謝過謝過
c語言 多種方法實現兩個數的交換
交換兩個數的內容是c語言中常見的問題,所以在此總結一下我所學到的幾種方法。首先,舉乙個例子,假設a 10,b 20.第一種方法,借助乙個臨時變數來進行儲存,這是最容易也是最直觀的方法。如下 int a,b,t a 10 b 20 printf a d b d a,b t a a b b t prin...
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語言 使用函式實現兩個數的交換。
此題的解決思路為 建立乙個swap函式,引數為a和b,函式內部建立乙個臨時變數tmp,用於交換兩個數。但需要注意的是 函式傳參的過程中需要注意,形參是實參的乙份臨時拷貝,形參的改變不會影響實參,所以此時函式傳參的時候需要傳遞實參的位址 a 即傳址呼叫,在接收部分就要使用指變數來接收 p 這樣可以使實...