這裡主要是討論算法的實現,看似簡單,其實不同算法的實現思想不一樣。
假設一個很普通的例子,輸入a,b,c三個整數,按升序排列。
方法一:a,b,c兩兩比較,有6種組合,用if ...else if實現,如下:
#include<stdio.h>
int main(){
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if(a <= b && b <= c) printf("%d %d %d\n", a, b, c);
else if(a < = c && c <= b) printf("%d %d %d\n", a, c, b);
else if(b < = a && a <= c) printf("%d %d %d\n", b, a, c);
else if(b < = c && c <= a) printf("%d %d %d\n", b, c, a);
else if(c < = a && a <= b) printf("%d %d %d\n", c, a, b);
else if(c < = b && b <= a) printf("%d %d %d\n", c, b, a);
return 0;
}
方法二:覺得上面的分支太多,先a,b比較,如果a>b,則交換;再a,c比較,如果a>c,則交換;最後b,c比較,如果b>c則交換。
#include<stdio.h>
int main(){
int a, b, c, t;
scanf("%d%d%d",&a, &b, &c);
if(a > b){t = a; a = b; b = t;}
if(a > c){t = a; a = c; c = t;}
if(b > c){t = b; b = c; c = t;}
printf("%d %d %d\n", a, b, c);
return 0;
}
方法三:設定當前最小值x和最大值z,初始化值均為a,隨著比較的進行,最小值和最大值慢慢更新。變成最後的真實的最大最小值。知道最小最大值,那麼中間值y可以算出來的。
#include<stdio.h>
int main(){
int a, b, c, x, y, z;
scanf("%d%d%d", &a, &b, &c);
//min x;max z
x = a; if(b < x) x = b; if(c < x) x = c;
z = a; if(b > z) z = b; if(c > z) z = c;
y = a + b + c - x - z;
printf("%d %d %d\n", x, y, z);
return 0;
}
另外附帶一題:
輸入正整數n<=30,輸出一個n層的倒三角。例如n=5時,輸出如下:
* * * * * * * * *
* * * * * * *
* * * * *
* * *
*
我的實現如下:
#include <stdio.h>
int main(){
int i, t, j, k;
scanf("%d",&i);
for(t = i; t >= 1; t--){
//先輸出2個空格字符
for(k = i - t; k > 0; k--)
{
printf(" ");
}
//後輸出"* "字符
for(j = 2*t - 1; j>=1; j--){
printf("* ");
}
//換行
printf("\n");
}
return 0;
}