357,交換兩個數字的值

2021-10-05 20:00:43 字數 3418 閱讀 3122

1,臨時變數實現

一般情況下交換兩個數字的值,我們都會使用乙個臨時變數,像下面這樣

private

void

swap

(int

array,

int i,

int j)

當然這段**非常簡單,哪怕是剛接觸過程式設計的同學也都能看的懂,我們今天要講的肯定不是上面這段**這麼簡單。那麼除了上面這種方法還有沒有其他的方法呢,在前面我們大致提到過3種實現方式,但具體細節沒有詳細講解,今天我們就來一起看下,首先我們來看加法的實現

2,加法實現

private

void

swap2

(int

array,

int i,

int j)

}

1,第3行相當於把array[i]和array[j]的和存放到了array[i]中,這裡用粗體表示。

2,第4行array[j]=array[i]-array[j];相當於array[j]=(array[i]+array[j])-array[j];也就是array[j]=array[i],相當於把array[i]的值賦值給了array[j]。

3,第5行array[i]=array[i]-array[j];因為上一步已經把array[i]賦值給了array[j],所以這裡相當於array[i]=(array[i]+array[j])-array[i];也就是array[i]=array[j];所以最終實現了array[i]和array[j]的數值交換。

上面其實很好理解,不需要再過多的討論,下面我們來分析一下當array[i]和array[j]都非常大,相加的時候出現了數字溢位,該怎麼辦,其實這個不用擔心的,因為如果出現了溢位,最多也只能溢位一位,而int型別的最高位是符號位,是1表示的是負數,0表示的是非負數,而這個符號位是可以參與加減運算的。

我們要明白一點,在計算機中所有的加減法其實都是加法,首先是把我們要計算的數轉換為二進位制,然後再進行運算,負數會以補碼的形式存在,當然正數的補碼和原碼相同。我們先來看一段非常簡單的**

public

static

void

main

(string[

] args)

看一下執行的結果

我們看到a+(-b)最高位其實已經出現了溢位,但這並不影響最終的結果。

3,減法實現

上面我們使用了加法交換兩個數字的值,那麼能不能使用減法呢,當然也是可以的,我們來看下**

private

void

swap3

(int

array,

int i,

int j)

}

其實原理都是一樣的。

4,乘法實現

那我們能不能使用乘法呢,我們知道加法最多往前進一位,而乘法就不一樣了,他可能會往前進好多位。這個能不能使用就要看數字大小了,還有一些特殊數字,比如0。如果兩個數字比較小且相乘的結果不會出現數字溢位,並且乘數中又沒有0,那麼是可以的,我們看下**

private

void

swap4

(int

array,

int i,

int j)

}

但一般情況下我們不要寫出這種**,因為這樣很可能就會出現數字溢位導致結果錯誤。如果是除法呢,那麼這種就更不用再討論了。

5,邏輯運算子實現

那麼除了以上還有沒有其他可能呢,比如使用&(與)和|(或)運算子能不能實現,當然也是可以的,我們看下**

private

void

swap5

(int

array,

int i,

int j)

這種實現很雞肋,因為第2行其實就是int temp =array[i]^array[j] ,我故意寫繞了,只是看大家能不能看的懂,雖然也能實現兩個數字的交換,也不用考慮數字溢位問題,但對演算法不好的同學來說也不是很好理解,原理就不在說了,我們可以隨便找幾個資料測試一下

int

array =

; system.out.

println

("資料交換之前的值");

util.

printintarrays

(array)

; system.out.

println()

;new

swap()

.swap5

(array,0,

1);new

swap()

.swap5

(array,2,

3);new

swap()

.swap5

(array,4,

5); system.out.

println

("兩兩交換之後的值");

util.

printintarrays

(array)

;

執行結果如下

每兩個兩個的交換,最終也是實現了數值的交換。

6,異或運算子實現

看了上面的**我們是不是有點啟發,因為異或運算其實還是很強大的,比如0a=a,aa=0,同時他還滿**換律,比如abc=acb,(異或運算)不像&(與)和|(或)那麼傻,(異或運算)有記憶功能,他和+,-,*,÷這些符號一樣,如果知道結果和其中的乙個值就可以確定另外乙個值了,而&(與)和|(或)就不能完全確定了。比如a&1=1或者a&1=0,我們可以確定a的值,但如果a&0=0,我們就無法確定a究竟是0還是1了。那我們這裡就仿照+運算子來寫乙個,**很簡單

private

void

swap6

(int

array,

int i,

int j)

}

所以交換兩個數字的值並不是必須要有乙個臨時變數,寫法也不僅僅侷限於一種,只要我們多思考,還是有很多種寫法的。

交換兩個數的值

include iostream.h 解法二 include iostream.h void swap int x,int y void swap int x,int y void main void main 請同學們想一下,哪乙個能實現數值交換!我來告訴大家,解法可以實現這個功能!解法一 他把a...

C 交換兩個數的值

需要臨時變數 1 使用引用 引用即別名 void swap1 int a,int b 函式時的格式 swap1 x,y 2 指標 void swap2 int a,int b 呼叫該函式時的格式 swap2 x,y 2.不需要臨時變數 1 假如 a 3,b 4。想將a和b的值互換,可以用一下賦值語句...

C 系列 交換兩個數字

1.建立中間變數 這是最快也是最簡單的辦法,例如 include int main 2.呼叫函式交換兩個數的值 include void swap int p1,int p2 int main 3.用加減或乘除運算來交換 include int main 我這裡寫的是用加減法實現,很顯然成功了,乘除...