Hdu 2000 ASCII码排序
题目
Problem Description
输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。
Input
输入数据有多组,每组占一行,有三个字符组成,之间无空格。
Output
对于每组输入数据,输出一行,字符中间用一个空格分开
Sample Input
qwe
asd
zxc
Sample Output
e q w
a d s
c x z
分析
这道题是一道比较简单的排序题目,有三个需要注意的地方:
① scanf()输入函数输入的字符会将其保存在缓冲区中,也包括了“\n”回车符,所以这道题目中 如果采用scanf()输入a,b,c三个字符时,缓冲区其实保存了a,b,c和\n四个字符,在下一次输入测试实例时,\n会被当做第一个字符进行计算,所以导致错误。
解决方法:可以使用getchar()函数将\n读取掉,也可以直接使用字符串数组进行接收字符。
② 在C语言中,字符可以直接用来进行比较,比较的是字符对应的ASCII编码
③比较a,b,c,先比较a,b,如果a>b,互换值,再比较a,c,如果a>c,互换值,此时a已经最小的值了,所以只需要再比较一下b,c即可
代码如下
#include <stdio.h>
int main() {
char a,b,c;
char str[3];
int i,temp=0;
while(scanf("%s", str) != EOF) {
a = str[0];
b = str[1];
c = str[2];
if(a>b) { //a,b换
temp=a;
a=b;
b=temp;
}
if(a>=c) { //在a<b的基础上,如果a还大于c,那 a就是最小的
temp=c;
c=b;
b=temp;
temp=b;
b=a;
a=temp;
}
if(b>c) { //此时a的值已经是最小的,比较bc
temp=c;
c=b;
b=temp;
}
printf("%c %c %c\n",a,b,c);
}
return 0;
}
优化
#include <stdio.h>
int main()
{
char a,b,c,d,x,y,z;
while(scanf("%c%c%c%c",&a,&b,&c,&d) != EOF)
{
x=a<b?a:b;
x=x<c?x:c;
z=a>b?a:b;
z=z>c?z:c;
y=a+b+c-x-z;
printf("%c %c %c\n",x,y,z);
}
}