1. 程式人生 > >C語言交換兩個變數數值的幾種方法

C語言交換兩個變數數值的幾種方法

因為經常見到這類題目,就自己總結了以下幾種辦法
1. 建立中間變數
這是最快也是最簡單的辦法,例如:

#include<stdio.h>

int main()
{
    int a=10;
    int b=20;
    int temp;
    printf("交換前a,b的值為:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    temp=b;
    b=a;
    a=temp;
    printf("交換後a,b的值為:\n");
    printf("a=%d\n",a);
    printf
("b=%d\n",b); return 0; }

執行結果:
這裡寫圖片描述

很顯然,交換成功了。不過看著很low的樣子,那接著來第二發

2.呼叫函式交換兩個數的值

#include<stdio.h>

void swap(int *p1,int *p2)
{
    int temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}

int main()
{
    int a=10;
    int b=20;
    printf("交換前a,b的值分別為:\n");
    printf("a=%d\n",a);
    printf
("b=%d\n",b); swap(&a,&b); printf("交換後a,b的值分別為:\n"); printf("a=%d\n",a); printf("b=%d\n",b); return 0; }

這裡寫圖片描述
一樣完成了交換,而且逼格高一些了,不過卻顯得更加繁瑣。那就來個不繁瑣的,接著發。
注意:此方法會牽扯函式的傳值呼叫和傳址呼叫問題,關於此,可以參見我的另一篇部落格,部落格地址:http://blog.csdn.net/ljx_5489464/article/details/50035875
3.用加減或乘除運算來交換

#include<stdio.h>
int main() { int a=10; int b=20; printf("交換前a,b的值分別為:\n"); printf("a=%d\n",a); printf("b=%d\n",b); a=a+b; //a=a*b; b=a-b; //b=a/b; a=a-b; //a=a/b; printf("交換前a,b的值分別為:\n"); printf("a=%d\n",a); printf("b=%d\n",b); }

這裡寫圖片描述
我這裡寫的是用加減法實現,很顯然成功了,乘除法是類似的,大家可以自己試試。可以看到一來,省去了建立中間變數,看起來也不算複雜。
這裡寫圖片描述
不過,這種方法可能會產生使數值溢位的問題。
這裡寫圖片描述

所以這種方法是有缺陷的,那有沒有類似的不溢位的方法呢? 答案是肯定的,有。下面就來看這種不溢位的方法。

4.用異或交換

#include<stdio.h>

int main()
{
    int a=10;
    int b=20;
    printf("交換前a,b的值分別為:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    a=a^b;
    b=a^b;
    a=a^b;
    printf("交換前a,b的值分別為:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
}

這裡寫圖片描述
掌握這種方法,就要知道什麼叫異或。異或:一般是針對二進位制數來說的,它的規則就是如果兩個二進位制數不相同,則異或結果為1;否則,異或結果為0。
這種方法看著和第三種很類似,但卻比它更嚴謹。為什麼這麼說,因為上面說了,加減乘除這種方法很能會產生溢位錯誤,而異或卻完全不會。因為兩個二進位制數異或的結果只能是0或1,不會產生進位或借位,不會超出變數的表示範圍。

5.用位運算交換

#include<stdio.h>

int main()
{
    int a=10;
    int b=20;
    printf("交換前a,b的值分別為:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    b = (__int64)((__int64)a << 32 | (a = b)) >> 32;
    printf("交換前a,b的值分別為:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    return 0;
}

這裡寫圖片描述
最後,介紹一種高逼格的方法,很少人會想到。__int64表示64位整型變數,這個在VC6.0裡是支援的。
b = (__int64)((__int64)a << 32 | (a = b)) >> 32; 這個語句中a=b的值為b的值20,同時把b的值賦給a。整個語句的意思:先把a強制轉化為64位整型變數,然後把它左移32位後與(a=b)按位或,把整個結果再強制轉換為64位整型變數,然後右移32位得到b的值。其實,求b的值沒必要有|(a=b)這部分,但因為想同時把b的值賦給a,且把|(a=b)放在這兒不會影響到b最終的值,所以寫成這樣。這兒就採用移位的方法避免了用中間變數。

方法應該很多,這只是我總結的幾種我掌握了的。大家有什麼好方法希望多多交流。

相關推薦

C語言交換變數數值方法

因為經常見到這類題目,就自己總結了以下幾種辦法 1. 建立中間變數 這是最快也是最簡單的辦法,例如: #include<stdio.h> int main() { int a=10; int b=20; i

C語言 交換變數數值多種方法

在我們學習程式設計過程中一定編寫過交換兩個變數數值方法,這裡我也蒐集網路一些方法平臺:ubuntu10  gcc編譯器下面再寫下交換兩個變數值的方法: #include <stdio.h> //第一種不講了,太簡單了,大部分都會想到,看著很LoW,所以接著往下看

C語言數值交換——指標

     C語言中交換兩個變數的值可以在主函式中直接實現,也可以通過子函式來實現。下面我們介紹用子函式實現的情況。    1.將兩個變數的值作為實參直接傳遞,在子函式內部定義一個普通變數來對兩個形參進行交換,並分別在子函式和主函式中列印。#include <stdio.

C 原地交換變數的值

第一種方法,大家會藉助第三個變數來實現: 如:tmp=A;A=B;B=tmp; 這種方法需要藉助第三變數來實現; 第二種方法是利用加減法實現兩個變數的交換: 如:A=A+B;B=A-B;A=A-B; 但是 如果 A+B 超出 A的範圍 ,會引起溢位。 第三種方法是

交換變數的三方式

這裡我們介紹三種交換變數的方式: 第一種: 這也是最為常用的一種,引入第三個變數: a=1; b=2; 引入第三個變數c交換: c=a; a=b; b=c; 此時a=2,b=1; 第二種:不用引入第三個變數,利用加減法實現 a=1; b=2; 交換

交換整數的三方法

交換a和b ————————————————————————— 第一種 temp = a; a = b; b = temp; 缺點: 建立臨時變數,浪費資源。 相對來說以

C語言練習篇-2交換變數的值

練習:交換兩個變數的值。 方法一:中間變數 #include <stdio.h> int main() { int a=10; int b=4; printf("

C語言小程式--交換變數的值

 看到這個題目首先我們可以想到藉助一個第三變數來實現 例如:a=10,b=20  我們想要交換a與b的值,可以藉助一個第三變數temp,把a的值附給temp,把b的值給a,再把temp的值給b,就

面試官在“逗”你係列:不借助第三變數交換數值的方案你有

引言 在我們學習程式設計之初,就學習過變數的賦值操作,同時也學習了將一個變數的值賦值給另外一個變數。對於交換兩個變數的值,很多童鞋都有解決方案。然鵝,對於面試官提出的不借助第三變數來交換兩個變數的值,你能想到幾種解決方案呢? 如果你只知道一種方案,請你認真看下去... 如果你知道兩種方案,那麼你可以來了解更

c語言實現陣列中的內容進行交換。(陣列一樣大)

方法一:建立新的陣列。 #include<stdio.h> #include<stdlib.h> int main() { int arr1[5] = { 1, 2, 3, 4, 5, }; int arr2[5] = { 0, 6, 7, 8, 9, }

C語言整形變數的值互換

題目要求 給定兩個整形變數的值,將兩個值的內容互換。 1.引入一個新的變數temp 程式碼如下: #include<stdio.h> #include<stdlib.h> int main() { int a=10; int b=20

C# 中不使用 第三方變數交換變數的值

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中的值就進行了交換。表面上看起來

JAVA和C++ 交換變數的值的函式 區別

在程式開發的過程,要交換兩個變數的內容,是一種比較常見的事情。在排序演算法中,就有一種就叫做“交換排序法”。在所有的排序演算法,交換要排序的集合中的兩個元素,幾乎是必須的過程。在Java中交換兩個元素的內容,如果你是程式設計師新手,你可能碰到意想不到的問題。 眾所周知,

LR中用C語言比較字符串變量

nat [] 變量 end put tar 字符串 init rmi 以下腳本,定義兩個一樣的字符數組,對比後,打印出result的值: Action() { int result; char string1[] = "We can see the st

交換變數的值,不使用第三變數方法

  Q1: 我們都知道交換兩個數的數值可以用三行程式碼解決,這是在C語言中就學過的: int c; c = a; a = b; b = c;   數學老師可能會給我們這個建議: a = a + b; b = a - b; //b=a+b-b=a a =

一道簡單的演算法題:不借助第三變數交換變數的值

今天做筆試碰到一道簡單的演算法題:不借助第三變數來交換兩個變數的值,記錄一下。 交換兩個變數的值的普遍做法都是藉助第三變數,這樣具有較高的可讀性。 a = 3 b = 5 t = a a = b b = t 但是,如果記憶體有限,只允許用2個變數呢? 強大的CS當然有辦法解決

深思通過異或運算交換變數

平常程式設計的時候交換兩個數的需求很常見,比如說氣泡排序裡面的位置交換,我們一般都會使用下面這種方法: public void swap(int a, int b){ int temp = a; a = b; b = temp; } 最近右發現一個抖機靈的方法,看著逼格很

關於交換數值的三方法

1,臨時變數法: temp=A; A=B; B=temp; 2,求差法: A=A-B; B=A+B; //B=A-B+B=A A=B-A; //A=A-A+B 3,異或法: A=A^B; B=A^B; //B=A^B^B=A A=A^B; //A=A^B^A=B 第一種方法最

一行python程式碼寫九九乘法表,1,2,3…到100的和,交換變數的值

用一行程式碼輸出九九乘法表: 第一種方法: print('\n'.join([' '.join(["%d*%d=%d"%(i,j,i*j) for i in range(1,j+1)])for j in range(1,10)])) 第二種方法: print('\n'.join

採用位異或方式將變數數值調換

1 package debug; 2 3 class Demo2 { 4 public static void main(String[] args){ 5 int a = 1; 6 int b = 2; 7 System.out.