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

2022-07-26 01:35:24 字數 5291 閱讀 9882

1樓:匿名使用者

最近在看《c++從入門到精通》自學c++,裡面有一道課後題是如何做到不適用第三個變數來交換兩個數的值,以下是我在網上查詢到的資料,記錄下並作為筆記。

題目:a=10,b=15,將a / b的值互換。

通常我們的做法是(尤其是在學習階段):定義一個新的變數,藉助它完成交換。**如下:

int a,b;

a=10; b=15;

int t;

t=a; a=b; b=t;

這種演算法易於理解,特別適合幫助初學者瞭解計算機程式的特點,是賦值語句的經典應用。在實際軟體開發當中,此演算法簡單明瞭,不會產生歧義,便於程式設計師之間的交流,一般情況下碰到交換變數值的問題,都應採用此演算法(以下稱為標準演算法)。

上面的演算法最大的缺點就是需要藉助一個臨時變數。那麼不借助臨時變數可以實現交換嗎?答案是肯定的!

1) 算術運算

簡單來說,就是通過普通的+和-運算來實現。**如下:

int a,b;

a=10;b=12;

a=b-a; //a=2;b=12

b=b-a; //a=2;b=10

a=b+a; //a=10;b=10

通過以上運算,a和b中的值就進行了交換。表面上看起來很簡單,但是不容易想到,尤其是在習慣標準演算法之後。

它的原理是:把a、b看做數軸上的點,圍繞兩點間的距離來進行計算。

具體過程:第一句「a=b-a」求出ab兩點的距離,並且將其儲存在a中;第二句「b=b-a」求出a到原點的距離(b到原點的距離與ab兩點距離之差),並且將其儲存在b中;第三句「a=b+a」求出b到原點的距離(a到原點距離與ab兩點距離之和),並且將其儲存在a中。完成交換。

此演算法與標準演算法相比,多了三個計算的過程,但是沒有藉助臨時變數。(以下稱為算術演算法)

該演算法還可以這樣做:

int a,b;

a=10;b=12;

a=a+b=22;

b=a-b=10;

a=a-b=12;

兩個減操作一個加操作,執行的先後順序不一樣,其原理也稍微有些區別,但根本原理是一樣滴。

3) 位運算

通過異或運算也能實現變數的交換,這也許是最為神奇的,請看以下**:

int a=10,b=12; //a=1010^b=1100;

a=a^b; //a=0110^b=1100;

b=a^b; //a=0110^b=1010;

a=a^b; //a=1100=12;b=1010;

此演算法能夠實現是由異或運算的特點決定的,通過異或運算能夠使資料中的某些位翻轉,其他位不變。這就意味著任意一個數與任意一個給定的值連續異或兩次,值不變。

即:a^b^b=a。將a=a^b代入b=a^b則得b=a^b^b=a;同理可以得到a=b^a^a=b;輕鬆完成交換。

以上三個演算法均實現了不借助其他變數來完成兩個變數值的交換,相比較而言算術演算法和位演算法計算量相當,地址演算法中計算較複雜,卻可以很輕鬆的實現大型別(比如自定義的類或結構)的交換,而前兩種只能進行整形資料的交換(理論上過載「^」運算子,也可以實現任意結構的交換)。

2樓:傾瑤茉韻

算術運算;指標地址操作;位運算;棧實現。

具體操作如下:

算術運算

int a,b;

a=10;b=12;

a=b-a; //a=2;b=12

b=b-a; //a=2;b=10

a=b+a; //a=10;b=10

它的原理是:把a、b看做數軸上的點,圍繞兩點間的距離來進行計算。

具體過程:第一句「a=b-a」求出ab兩點的距離,並且將其儲存在a中;第二句「b=b-a」求出a到原點的距離(b到原點的距離與ab兩點距離之差),並且將其儲存在b中;第三句「a=b+a」求出b到原點的距離(a到原點距離與ab兩點距離之和),並且將其儲存在a中。完成交換。

此演算法與標準演算法相比,多了三個計算的過程,但是沒有藉助臨時變數。(以下稱為算術演算法)

缺點:是隻能用於數字型別,字串之類的就不可以了。a+b有可能溢位(超出int的範圍),溢位是相對的, +了溢位了,-回來不就好了,所以溢位不溢位沒關係,就是不安全。

指標地址操作

int *a,*b; //假設

*a=new int(10);

因為對地址的操作實際上進行的是整數運算,比如:兩個地址相減得到一個整數,表示兩個變數在記憶體中的儲存位置隔了多少個位元組;地址和一個整數相加即「a+10」表示以a為基地址的在a後10個a類資料單元的地址。所以理論上可以通過和算術演算法類似的運算來完成地址的交換,從而達到交換變數的目的。

位運算int a=10,b=12; //a=1010^b=1100;

a=a^b; //a=0110^b=1100;

b=a^b; //a=0110^b=1010;

a=a^b; //a=1100=12;b=1010;

此演算法能夠實現是由異或運算的特點決定的,通過異或運算能夠使資料中的某些位翻轉,其他位不變。這就意味著任意一個數與任意一個給定的值連續異或兩次,值不變。

棧實現。

int exchange(int x,int y)

stack s;

push(s,x);

push(s,y);

x=pop(s);

y=pop(s);

以上演算法均實現了不借助其他變數來完成兩個變數值的交換,相比較而言算術演算法和位演算法計算量相當,地址演算法中計算較複雜,卻可以很輕鬆的實現大型別(比如自定義的類或結構)的交換,而前兩種只能進行整形資料的交換(理論上過載「^」運算子,也可以實現任意結構的交換)。

3樓:

明目張膽?膽小如鼠?鼠目寸光?

怎麼在j**a上完成,實現兩個int型別變數的交換,不使用中間變數

4樓:夜獨行孤單

方法有很多,這裡舉出兩種常用的:

方法1:使用^操作來實現

int x = 10;

//用二進位制表示:x=0b1010;

int y = 15;

//用二進位制表示:x=0b1111;

system.out.println("x="+x+" y="+y);

x = x^y;

//x^y= 0b1010^0b1111 = 0b0101

y = x^y;

//x^y= 0b0101^0b1111 = 0b1010 =10

x = x^y;

//x^y= 0b0101^0b1010 = 0b1111 =15

system.out.println("x="+x+" y="+y);

方法2:使用+,-操作來實現

int x = 10;

int y = 15;

system.out.println("x="+x+" y="+y);

x = x+y;

//x= 10+15=25

y = x-y;

//y= 25-15=10

x = x-y;

//x= 25-10=15

system.out.println("x="+x+" y="+y);

結果:x=10 y=15

x=15 y=10

早期為了減少中間變數對計算機記憶體的佔用,採用中間的方法來交換資料。其實這種交換並不完美,如果交換的兩個數都很大,可能會記憶體溢位。在現在的開發中建議使用中間值來交換數值。

5樓:匿名使用者

static class num

public static void swap1(num num)

6樓:

方法很多,我比較喜歡的這種:

int x = 10;

int y = 15;

system.out.println("x="+x+" y="+y);

x = x-y;

//x= 10-15=-5

y = x+y;

//y= -5+15=10

x = y-x;

//x= 10-(-5)=15

system.out.println("x="+x+" y="+y);

結果:x=10 y=15

x=15 y=10

我自己覺得,算是比較好的一種方法,看著比較複雜了一點,減少了中間變數的記憶體佔用,也不會有溢位。

不借用第三個變數,怎麼把a,b的值互換

7樓:

方式一:三次加減操作

int a =10;int b=5;

a= a+b;

b=a-b;

a=a-b;

方式二:三次異或操作

int a=2=010(二進位制);

int b=4=100(二進位制);

異或運算如下:

a=a^b=010^100=110(此時,a的值改變為二進位制的110)

b=a^b=110^100=010(此時,b的值改變為二進位制的010,即十進位制的2)

a=a^b=110^010=100(此時,a的值改變為二進位制的100,即十進位制的4)

8樓:匿名使用者

#python下,只要下面兩行

a = 1,b = 2

a , b = b , a

#ok ,print 下a , b的值就知道已經互換了。

j**a中不用第三方變數交換兩個int變數的值有哪種方式?

9樓:等你回眸

要交換兩變數 a,和b的值,有三種方法:

方法一:

a = a + b;

b = a - b;

a = a - b;

方法二:

a = a * b;

b = a / b;

a = a / b;

方法三:

a = a ^ b;

b = a ^ b;

a = a ^ b;

10樓:天堂向右

假設你要交換兩變數 a,和b的值:

方法一:

a = a + b;

b = a - b;

a = a - b;

方法二:

vb交換兩個變數的值命令輸入VB將ab兩個變數的值互換

不是很懂你的意思哦,一般 交換的話,採用第三個變數過度下,例如變數a,b 重新弄個變數c 就可以實現了!交換a,b的值c a 將a賦給中間變數ca b 將b值賦給ab c 將c 即a的值 賦給b交換完畢!嘿嘿,兩個變數照樣可以交換的。一 交換按抄鈕命令 private sub mand click ...

兩個IP交換機兩個路由,如何實現多臺電腦上網

外網網線到路由器wan口,路由器lan口到交換機,交換機到其他計算機.兩臺電腦怎麼共用一個ip?有交換機。你是說的外網ip嗎?如果是的話,用路由器,然後每個機器就又有一個不同的內網ip了。這樣原來的ip是同一個,不會衝突。區域網是不可能共用ip的。交換機如何設定多臺電腦同時上網?如何使用交換機把兩臺...

如何用c語言求輸入兩個整數a和b交換他們的位置

include int main void c語言。任意從鍵盤上輸入兩個正整數a,b交換值後列印輸出?include int main void c語言 輸入a和b兩個整數,按先小後大的順序輸出a和b 交換指標 1 新建一個工程和.c檔案 輸入標頭檔案和主函式。2 然後開始定義變數型別。3 輸入a和...