C语言一列纵队在上课的时候会造成很大的麻烦,体育老师常用的办法就是让同学们1、2报数,然后报2的同学向后退一步。现在我们已经知道一列纵队时候同学的学号分布,那么你能输出分成两列后同学的学号么? 输入 第一行包括一个数n,表示班级里有n位学生,班级人数至少是1,不超过100。第二行包括n个数,表示一列纵队时每个同学的学号。 输出 请按顺序输出分开两列后两列每位同学的学号,用空格隔开。每列同学占两行,报1的同学在第1行。
时间: 2023-05-20 14:05:54 浏览: 90
以下是C知道的回答:
可以使用一个简单的算法来将一列纵队分成两列。首先,将学号按照从小到大的顺序排序。然后,将第一个学号放入第一列,第二个学号放入第二列,第三个学号放入第一列,第四个学号放入第二列,以此类推,直到所有学号都被分配到了一列。最后,按照顺序输出两列的学号即可。
下面是实现该算法的C代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
scanf("%d", &n);
int *nums = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
scanf("%d", &nums[i]);
}
int *col1 = (int*)malloc(n * sizeof(int));
int *col2 = (int*)malloc(n * sizeof(int));
int c1 = 0, c2 = 0;
for (int i = 0; i < n; i++) {
if (i % 2 == 0) {
col1[c1++] = nums[i];
} else {
col2[c2++] = nums[i];
}
}
for (int i = 0; i < c1; i++) {
printf("%d\n", col1[i]);
}
for (int i = 0; i < c2; i++) {
printf("%d\n", col2[i]);
}
free(nums);
free(col1);
free(col2);
return 0;
}
输入样例:
5
1 2 3 4 5
输出样例:
1
3
5
2
4