兩個數字交換不用第三個變數

2021-10-04 04:39:13 字數 1481 閱讀 9106

交換函式

注意:雖然不用第三方變數的寫法感覺很牛,但是在複雜的程式環境中容易出現bug(下面會舉例bug)並且技巧性越強的**bug越不好找;因此只需掌握不用第三個變數的思路,平時最好用第三個變數來交換兩個數字

1.常用,最好理解:用第三方變數協助交換(相當於一瓶可樂,一瓶雪碧交換,用乙個空瓶子實現)

void swap(int *p1 , int *p2)

int main()

2.不用第三方變數(重在思路)

2.1 加減交換

a =10 ; b=20

b=a+b 10 30

a=b-a2030

b=b-a20 10

void swap(int *p1 , int *p2)

同理: b = b - a;

a = a + b;

b = a - b;

也可以2.2 異或交換

int a =10 ; b=20 (int4個位元組中前三個全為0,省略)

0000 1010 (10) 0001 0100(20)

a=a^b 0001 1110 (30) 0001 0100(20)

b=b^a 0001 1110 (30)0000 1010(10)

a+a^b0001 0100(20) 0000 1010(10)

void  swap(int *p1 , int *p2)

void

reverse

(int

*arr,

int len)

//陣列逆置

}void

show

(int

*arr,

int len)

//列印

printf

("\n");

}int

main()\

; 偶數沒問題

int arr=

;// 奇數,結果出錯

reverse

(arr,

sizeof

(arr)

/sizeof

(arr[0]

));show

(arr,

sizeof

(arr)

/sizeof

(arr[0]

));return0;

}

發現結果出錯位子在 陣列中間,即 i 和 j 相等時

除錯:

當 i 和 j 相等,執行swap第乙個語句時,本應 * p2變為 * p2+ * p1;* p1 不變,但除錯發現 * p1也變為了 * p2+ * p1;再執行swap剩餘語句後,arr[1]=0;

將**中 i<=j 改為 i

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

字串版本 結合使用substr,strlen兩個方法實現 a a b b echo 交換前 a a.b b.a.b b substr a,0,strlen a strlen b a substr a,strlen b echo 交換後 a a.b b.echo 字串版本 使用str replace方...

如何不用第三個變數實現兩個數的交換

一般我們在寫程式時如果遇到兩個數需要交換時寫作如下 1 intx,y 23 inttemp 45 temp x x y y temp 而如果不允許有第三個變數出現即不允許有temp出現時應該如何做呢?可以寫作如下 1 intx,y 23 x x y 45 y x y 67 x x y 上述一般可以滿...

不用第三個變數進行交換兩數

include include using namespace std int main d c d c d c d d c cout c c d da a b b a b a a b cout a a b ba 3 b 2 c 3 d 2 a 2 b 3 press any key to cont...