Problem Description
输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数。
Input
输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测试实例的数值的个数,跟着就是n个整数。n=0表示输入的结束,不做处理。
Output
对于每组输入数据,输出交换后的数列,每组输出占一行。
Sample Input
4 2 1 3 4
5 5 4 3 2 1
0
Sample Output
1 2 3 4
1 4 3 2 5
Problem Description
输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数。
Input
输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测试实例的数值的个数,跟着就是n个整数。n=0表示输入的结束,不做处理。
Output
对于每组输入数据,输出交换后的数列,每组输出占一行。
Sample Input
4 2 1 3 4
5 5 4 3 2 1
0
Sample Output
1 2 3 4
1 4 3 2 5
提供一个不是很优的算法,
1. 用二维数据存储输入的数据,每一行第一个数字存放该行实际长度
2. 处理每一行找到最小值,与最大值位置互换
3. 输出处理结果
下面是我的代码(PS:大四开始就没写过C语言啦,语法有点遗忘)
#include <stdio.h>
#define ROW 100 // 最多支持100行
#define COLUMN 100 // 每行最多支持输入99个数字,第一个数字存长度
void inputNums(int nums[ROW][COLUMN]);
void changePosition(int nums[ROW][COLUMN]);
void printNums(int nums[ROW][COLUMN]);
int main() {
// 二维数组存储输入值
int nums[ROW][COLUMN];
// 数据输入
inputNums(nums);
// 数据处理
changePosition(nums);
// 数据输出
printNums(nums);
return 0;
}
void inputNums(int nums[ROW][COLUMN]) {
int row = 0;
do {
scanf("%d", &(nums[row][0])); // 第一个数字
if (nums[row][0] == 0) {
break; // 输入结束
}
// 输入n个数
for (int i = 1; i <= nums[row][0] && i < COLUMN; ++i) {
scanf("%d", &(nums[row][i]));
}
} while (++row < ROW);
}
void changePosition(int nums[ROW][COLUMN]) {
// 处理每一行数据找到最小值与第一个数字交换位置
for (int i = 0; i < ROW && nums[i][0] != 0; ++i) {
int min = nums[i][1];
int position = 1;
// 找到最小值及最小值的位置
for (int j = 2; j <= nums[i][0]; ++j) {
if (nums[i][j] < min) {
min = nums[i][j];
position = j;
}
}
// 位置交换
int t = nums[i][1];
nums[i][1] = min;
nums[i][position] = t;
}
}
void printNums(int nums[ROW][COLUMN]) {
for (int i = 0; i < ROW && nums[i][0] != 0; ++i) {
for (int j = 1; j <= nums[i][0]; ++j) {
printf("%d ", nums[i][j]);
}
printf("\n");
}
}