[日常練習] 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;
}