藍橋杯訓練第一天

填坑(1)關於C中的交換變量

例題1
輸入一個三位數,分離出它的百位、十位和個位,反轉後輸出。
樣例輸入:
127
樣例輸出:
721

分析:首先將三位數讀入變量n裏,然後進行分離。
百位:n/100
十位:n/10%10
個位:n%10
解法:

#include<stdio.h>
int main()
{
int n,a,b,c,d;
scanf("%d",&n);
a=n/100;
b=n%10/10;
c=n%10;
d=a+b10+c100;
printf("%d",d);
return 0;
}

以上是一道簡單的三位數交換位置的題,由此延伸變量交換的三種方法

例題2
輸入兩個整數變量a和b,交換二者的值,然後輸出。
樣例輸入
824 16
樣例輸出
16 824

解法一:三變量法

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

這種方法簡單的理解就是三個杯子,分別爲水,可樂,空。之後通過空杯將水與可樂互換。
解法二:兩變量法

#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d %d",&a,&b);
a=a+b;
b=a-b;
a=a-b;
printf("%d %d",a,b);
return 0;
}

舉個例子說明,這種方法是將水和可樂混合,然後過濾分解到不同的杯子裏。

注意!
兩變量法看起來很好,實際很少用,因爲它的適用範圍很窄,只有定義了加減法的數據類型才能採用此方法。
三變量法已經很簡單,適用範圍廣,推薦使用。
你以爲三變量法是解決本題最簡單的途徑嗎?恭喜你回答錯了。
多數的算法競賽採用黑盒測試,即只考察程序解決問題的能力,而不關心採用了什麼方法。對於本題最佳程序如下

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

請記住我們的目標是解決問題,而不是爲了寫程序而寫程序,不需要自己創造條件去展示編程技巧。
----2020.1.16
----藍橋杯訓練

發佈了9 篇原創文章 · 獲贊 3 · 訪問量 850
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章