文章目錄
- 一、題目
- 二、方法1
- 1,思路
- 2,代碼實現
- 三、方法2
- 1,思路
- 2,代碼實現
- 四、方法3
- 1,思路
- 2,代碼實現
- 總結
提示:以下是本篇文章正文內容,下面案例可供參考
一、題目
實現兩個變量的交換
輸入:a = 5,b = 3;輸出 :a = 3 ,b = 5。
二、方法1
1,思路
這個方法就是我們經常遇到此問題想到的空瓶交換,額外創建一個變量開辟一份空間來暫時存儲變量。好比下方圖片,我有三個碗,一個碗里面放了醋,一個放了醬油,我想將放醬油的碗里面放上醋,放醋的碗里面放上醬油。于是我需要第三個碗,先將醬油放在空碗內,在將醋倒進醬油碗中,在將空碗里的醬油放在醋碗中。
2,代碼實現
代碼如下(示例):
int main()
{int a = 5;int b = 3;int c = 0;printf("交換前:a = %d,b = %d\n", a, b);c = a;a = b;b = c;printf("交換后:a = %d,b = %d\n", a, b);return 0;
}
三、方法2
1,思路
這個是一個不創建中間變量的方法,但是此方法存在缺陷:如果a和b的很大,但是沒有超出整型的大小,a和b的值的和超出了整型的大小,超出整形大小的值之后,有些值就溢出了丟了,這樣和就不準確了,導致后面求出的值是錯誤的,所以這個方法交換得兩個數之和不大于整型變量的最小存儲值
- 先將a+b的值放在a中,此時a的值變成a+b
- 再將a-b的值放在b中,因為此時a變成了a+b,所以a-b的值等價于a+b-b=a,此時存放在b中的值變成a了。
- 最后一步將a-b的值放入a中,此時a的值還是a+b;b的值變成a了,所以a-b=b,此時存放在a中的值變成b了。
- 通過上面三步我們實現了a和b的交換。
2,代碼實現
代碼如下(示例):
int main()
{int a = 5; int b = 3; printf("交換前:a = %d,b = %d\n", a, b); a = a + b; b = a - b; //此時b = a + b - b = a; a = a - b; //此時a = a + b - a = b; printf("交換后:a = %d,b = %d\n", a, b); return 0;
}
四、方法3
1,思路
在這里我們采用的方法是
c語言操作符的解法
,在這里我們需要理解下面兩個c語言位操作符——按位異或的規律才可以得到正確的解法
- a ^ a = 0,按位異或的規則是按照二進制位進行按位異或,相同的位為0,不相同為1.兩個數都相同,相同所有位為0,所以所有數字都等于0
- a ^ 0 = a; 任何數與0異或都等于0,例如3^0 = 011^000 = 011 = 3;
- //a 0000 0000 0000 0000 0000 0000 0000 0101
//b 0000 0000 0000 0000 0000 0000 0000 0011
//^ 0000 0000 0000 0000 0000 0000 0000 0110 a = a^b
//^ 0000 0000 0000 0000 0000 0000 0000 0101 b = a^b = a
//^ 0000 0000 0000 0000 0000 0000 0000 0011 a = a^b = a
2,代碼實現
代碼如下(示例):
int main()
{int a = 5; int b = 3; printf("交換前:a = %d,b = %d\n", a, b); a = a ^ b; b = a ^ b; a = a ^ b; printf("交換后:a = %d,b = %d\n", a, b); return 0;
}
總結
上面是有關于交換兩個數的三種求法,但是實際中還是應用第一種方法,如果沒有硬性要求不能有中間變量建議使用第三種。如果大家還有其他的求解方法,歡迎大家留言小編及時補充。