解题思路:
首先回顾一下题目的输入格式与输出格式要求
输入:输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。
输出:对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。
首先要确定代码的输入是一个整数n,再接着n个不相同的整数;另外这里题目并没有对测试用例的数量进行说明,所以要清楚这里要用while循环(或者do while循环);接着就是数据的处理部分,就是单纯的从大到小排序,但是要注意是对每个整数的绝对值进行比较;最后的输出,就是排好序的n个整数。
注意事项:
1.一般在输入阶段,如果题目没有给出具体的测试数量,或者通过计算无法得出具体的处理次数,在代码中,对应则是while循环,而针对OJ的黑盒测试,测试的样本并不是无限数量的,所以应该考虑接收的输入可能到达文件末尾的情况,否则会导致输出超限。
2.在排序时,不应该只考虑整个循环结束后是否能够排好序,而也应该考虑有可能在循环结束之前就已经排好序了,所以应该加入一个标识位,来监测数组的排序状态,当排序一结束,就立马跳出循环,这样处理,对于大数据量的排序,可以达到明显的降低算法时间复杂度的效果。
3.对于题目的输出,可以有两种理解,第一种是对于一个测试用例就输出一次排序结果;第二种是对于所有的测试用例,最后一起输出排序的结果。个人认为第一种处理会使代码更加简单,同时这样处理也更加直观。
参考代码:
#include#includeint main() { int n, i, j, flag, temp; while(scanf("%d", &n) != EOF && n != 0) { int x[n]; for(i = 0; i < n; i++) { scanf("%d", &x[i]); } for(i = 1; i < n; i++) { flag = 1; for(j = 0; j < n - i; j++) { if(abs(x[j]) < abs(x[j+1])) { temp = x[j]; x[j] = x[j + 1]; x[j + 1] = temp; flag = 0; } } if(flag) { break; } } for(i = 0; i < n - 1; i++) { printf("%d ", x[i]); } printf("%d\n", x[i]); } return 0; }
0.0分
2 人评分
C语言训练-求素数问题 (C语言代码)浏览:1509 |
C语言程序设计教程(第三版)课后习题8.6 (C语言代码)浏览:564 |
C语言程序设计教程(第三版)课后习题10.4 (C语言代码)浏览:702 |
上车人数 (C语言代码)浏览:816 |
WU-输入输出格式练习 (C++代码)浏览:1133 |
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:651 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:1100 |
1054题解浏览:516 |
时间转换 (C语言代码)浏览:697 |
C语言程序设计教程(第三版)课后习题6.9 (C语言代码)浏览:609 |