1. 程式人生 > >[日常練習] 4. 基於交換兩整形變數值的三種方法的C語言實現。

[日常練習] 4. 基於交換兩整形變數值的三種方法的C語言實現。


當面試題遇到:交換兩整形變數的值。你是感到無比的“慶幸”遇到這麼簡單的面試題,還是有一點“慌張”,怕是自己想的太簡單了吧!今天我們就來處理幾道小題,並且深入探討一下交換兩整形的3種C語言實現方法!當你再遇到這種問題的時候,你將一點都不慌!你,穩得一批!


練習題目:

1. 給定兩個整形變數的值,將兩個值的內容進行交換。
2. 不允許建立臨時變數,交換兩個數的內容。
3.求10 個整數中最大值。
4.將三個數按從大到小輸出。
5.求兩個數的最大公約數。

題目分析及程式碼、結果展示:

1. 沒錯,它現在就是你想的那種,建立第三變數直接ok的題目...在此不要想太多了!

#include<stdio.h>

int main()
{
	int i = 1;
	int j = 2;
	int tmp = 0;               //建立第三變數

	printf("%d %d\n", i, j);  
	tmp = i;                   //通過第三變數進行交換
	i = j;
	j = tmp;
	printf("%d %d\n", i, j);
	return 0;
}

通過建立第三變數實現兩個整數值的交換,使我們最為常見的方法,在這我們也就不多贅述,畢竟後面才是我們的重頭戲


2. 當你瀟灑寫出上面的程式碼的時候,面試官狡黠一笑向你提出:“不允許建立第三變數,能不能搞定”。首先,你應該回復:“能啊!”(管它能不能,能就對了!)到了思考時間,我們來想一想這個過程,我們的目的就是為了交換兩個整數的值,那麼可以尋找到怎樣的關係式將兩者串聯起來呢?假設有A、B兩數,將兩者相加賦給A,此時A=A+B,那麼再有B=A-B,此時完成了A的值就傳給了B,那麼只需要進行最後一步A=A-B,此時的A=A+B,B就是A的值,就把B的值傳給了A,也就達到了我們的目的。

#include<stdio.h>

int main()
{
	int i = 18;
	int j = 23;               //未建立第三變數
	printf("%d %d\n", i, j);
	i = i + j;               //執行邏輯演算法
	j = i - j;
	i = i - j;
	printf("%d %d\n", i, j);
	return 0;
}

這個的邏輯算是比較簡單,需要去培養和樹立這樣的邏輯來豐富我們的眼界,再遇到這個問題就能做了。在這,我們再介紹一種高大上的方法:採用“異或操作符”,進行兩整數的交換!

#include<stdio.h>

int main()
{
	int i = 1;
	int j = 2;                 //未進行第三變數建立
	printf("%d %d\n", i, j);   
	i = i^j;                   //使用異或操作符
	j = i^j;
	i = i^j;
	printf("%d %d\n", i, j);
	return 0;
}

可以看到這個操作符的使用也是很簡單的解決了問題!

在這我們不對它進行詳細闡述、先思考思考、再自行上網查詢資料,相信你會收穫更多!


3. 求10個整數的最大值,其實也就是一個數組的遍歷比較問題,也可以將之理解為一個排序問題輸出那個最大值即可,但是也沒必要這麼的複雜。

#include<stdio.h>

int main()
{
	int i = 0;
	int max = 0;
	int arr[10] = {0};
	for(i=0; i<10; i++)
	{
		scanf("%d", &arr[i]);
	}
	max = arr[0];
	for(i=0; i<10; i++)
	{
			if(arr[i]>max)
				max = arr[i];
	}
	printf("max = %d\n",max);
	return 0;
}
#include<stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	int max = 0;
	scanf("%d %d %d", &a, &b, &c);
	if(a>b)
		max = a;
	else
		max = b;
	if(c>max)
		max = c;
	printf("max= %d\n", max);
	return 0;
}
#include <stdio.h>

int main()

{
    int a,b,r;
    printf("請輸入兩個正整數:\n");
    scanf("%d %d",&a,&b);
    if(a<b)
    {
		r=a;
        a=b;
        b=r;
    }
    //輾轉相除法,因為r的初始值不為0,所以while語句至少會執行一次
    //直至餘數為零,跳出迴圈
    while(r!=0)
    {
        r=a%b;
        a=b;
        b=r;
    }