解题思路:
首先回顾一下题目的输入格式与输出格式要求
输入:输入数据有多组,每组占一行,每行的第一个数字为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++代码)浏览:1044 |
C语言训练-大、小写问题 (C语言代码)浏览:724 |
【简单计算】 (C语言代码)浏览:622 |
简单的a+b (C语言代码)浏览:478 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:657 |
众数问题 (C语言代码)浏览:670 |
简单的a+b (C语言代码)浏览:504 |
小O的乘积 (C++代码)浏览:520 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:687 |
马拦过河卒 (C语言代码)浏览:1093 |