大家晚上好呀,这几天,有见到不少同学卡在1022这一道题目上,还有同学反复错误,找不到自己错误的点在哪的,今天这期,就跟大家聊一聊这道排序题,顺便跟大家讲一些不同的解法,希望各位都能有所收获。
- 题目描述
从键盘输入三个整数x,y和z,按从大到小的顺序输出它们的值。 - 输入
输入三个整数x,y和z。 - 输出
按从大到小的顺序输出它们的值。 - 参考代码:
#include<stdio.h>
main()
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
if(a>b&b>c)
printf("%d %d %d",a,b,c);
else if(a>c&&c>b)
printf("%d %d %d",a,c,b);
else if(b>a&&a>c)
printf("%d %d %d",b,a,c);
else if(b>c&&c>a)
printf("%d %d %d",b,c,a);
else if(c>b&&b>a)
printf("%d %d %d",c,b,a);
else if(c>a&&a>b)
printf("%d %d %d",c,a,b);
}
- 代码解析:这是大家比较多用的一种解法,也是容易错误的解法,根据我自己以前做这道题目时的一些经验,说一下这里的易错点。
1.条件遗漏,判断时没有把每种情况都算到位,导致答案错误。
2.输出遗漏空格,或者每个参数的位置弄错,导致答案错误。
其实大家在做这种判断条件比较多比较复杂的题目时,不妨可以先列一个表格出来,把要判断的条件写在纸上,在逐个输入,这样可以减少纰漏的几率。
下面再给大家介绍另一种可读性相对较强,不容易纰漏条件的解法:
#include <stdio.h>
int main()
{
int x, y, z, t;
scanf("%d %d %d", &x, &y, &z);
if(x < y)//判断x<y的情况
{
t = x;
x = y;
y = t;//如果x<y把x和y的值交换位置。让x无论如何都是大于y的。
}
//注意,,如果上面的判断成立的话在这一段后的两个if x 和y 的值已经交换。具体作用后文解释。
if(z > x)
{
printf("%d %d %d\n", z, x, y);//这里用z和x比较,如果z>x,则z必定大于y。
}
else if(z > y)//这里是用else if ,在判断完z>x不成立后,则知道z<x,如果这里z>y,则可得出x>z>y
printf("%d %d %d\n", x, z, y);
else
printf("%d %d %d\n", x, y, z);
return 0;
}
这种解法里,我们使用了1025题类似的解法;设置一个额外的值与这三个数进行比较。
判断顺序:
1.先判断一次x与y的大小。如果x<y,则让这两个值交换。如果x>y,则这两个值不变。让x无论如何都要大于y。(这里说的x与y只是参数)
2.判断z是否大于x,如果大于x,由于上文已经让x必定大于y,直接按序输出z,x,y即可。
3.如果z不大于x,则判断z是否小于y,如果z小于y,根据之前的判断,则可按序输出x,z,y;
4.如果z大于y,则按序输出:x,y,z;
第二种解法看似更复杂,但在判断更多整数的情况下,这种算法显然代码量会更少,也不用像第一种解法写这么多重复的代码,并且很容易出错。如果大家觉得第二种解法更适合自己的话,不妨可以用第二种解法去完成其他判断多个数值大小的题目,让自己更好的掌握这种方法。
功能同一样,算法千千万。
网友评论