编程介的小学生 2019-02-22 10:31 采纳率: 20.5%
浏览 1139

C语言scan输入n数,找出其中最小的数,将它与最前面的数交换后输出这些数

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

  • 写回答

2条回答

  • 张晓鱼 2019-02-22 11:54
    关注

    提供一个不是很优的算法,
    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");
        }
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog