美文网首页
山东理工OJ 2019级程序设计基础 l (2019秋季) 题目

山东理工OJ 2019级程序设计基础 l (2019秋季) 题目

作者: 不会编程的程序圆 | 来源:发表于2020-01-31 12:39 被阅读0次

    对你有帮助就点个赞吧,谢谢各位

    [每日一道算法题(C)]

    山东理工OJ 2019级程序设计基础 l (2019秋季) 题目编号:1523

    矩阵输出

    Problem Description

    输入n个整数,输出由这些整数组成的n行矩阵。

    Input

    第一行输入一个正整数N(N <= 20),表示后面要输入的整数个数。
    下面依次输入N个整数。

    Output

    以输入的整数为基础,输出有规律的n行数据。

    Sample Input

    5
    3 6 2 5 8

    Sample Output

    3 6 2 5 8
    8 3 6 2 5
    5 8 3 6 2
    2 5 8 3 6
    6 2 5 8 3


    1.观察规律
    2.思路

    对于这N个序列来说,每次的变化只是将最后一个数放到序列的第一位。
    1.我们可以用临时变量存储最后一个数的值
    2.然后让数组从 倒数第二个数 开始到 数组首位 结束 依次“向后移动一位”,也就是 a[N - 2] = a[N - 1]
    3.最后将临时变量所存储的数组最后一位元素的值 赋给 数组 首元素

    分析到这里其实这道题已经可以完成了,但是如果我只想要这个输出的矩阵的某一行呢?
    其实这个问题用上面的思路也是可以做的,就是需要多循环几次。如果我想一步就得到这个数组呢?

    我们用 N = 5 来举例
    观察题干中的输出样例,第一行是没有改变的,一共是 5 行
    1.我们可以创建一个和原数组同样大小的临时数组,将原来的数组分成两部分。
    2.第一部分是从 要放到数组首位的元素位置 到 数组最后一个元素
    3.第二部分是从 数组首元素开始 到 要放到数组首位的元素前一位


    #include<stdio.h>
    
    void matrix(int* arr, int n);//上题的解法看这个函数
    void matrix_any(int* arr, int N, int n);//得到你想要的顺序哪一行看这里
    
    int main() {
    
        int N = 0;
        int i = 0;
    
        scanf("%d", &N);
    
        int* arr = (int*)malloc(sizeof(int) * N);
    
        for (i = 0; i < N; i++)
            scanf("%d", &arr[i]);
    
        matrix(arr, N);//这种方法更加高效
    
        printf("\nwant one row only: input a row\n");
        int n = 0;
        scanf("%d", &n);
        matrix_any(arr, N, n);
    
        free(arr);
        return 0;
    }
    
    void matrix(int* arr, int n) {
    
        int i, j, k;
        int* tmp = (int*)malloc(sizeof(int) * n);//创建临时数组,保证不改变arr数组的原始顺序
    
        for (i = 0; i < n; i++)
            tmp[i] = arr[i];
    
        for (i = 0; i < n; i++) {
            if(i != 0){
                k = tmp[n - 1];//放到首位的数
                for (j = n - 2; j >= 0; j--) {
                    tmp[j + 1] = tmp[j];
                }
                tmp[0] = k;
            }
            for (j = 0; j < n; j++)
                printf("%d ", tmp[j]);
            printf("\n");
        }
    }
    
    void matrix_any(int* arr, int N, int n) {
    
        int i, j, k;
        int* tmp = (int*)malloc(sizeof(int) * N);
    
        for (j = N - n + 1, k = 0; j < N; j++, k++)
            tmp[k] = arr[j];
    
        for (j = 0; N - k > 0; j++, k++)
            tmp[k] = arr[j];
    
        for (k = 0; k < N; k++)
            printf("%d ", tmp[k]);
        printf("\n");
    
        free(tmp);
    }
    
    
    image.gif

    相关文章

      网友评论

          本文标题:山东理工OJ 2019级程序设计基础 l (2019秋季) 题目

          本文链接:https://www.haomeiwen.com/subject/fudgthtx.html