这里主要是讨论算法的实现,看似简单,其实不同算法的实现思想不一样。
假设一个很普通的例子,输入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;
}