美文网首页
天花板编程手把手计划-第1期-第1天-打卡

天花板编程手把手计划-第1期-第1天-打卡

作者: Hans941 | 来源:发表于2017-04-20 21:23 被阅读0次

    题目

    给出任意一个N*N的矩阵,将里面的数字按照从左上到右下有小到大排序,之后计算出新矩阵对角线上的数字总和(每个位置只参与一次计算)。例如:



    给出左边这个矩阵,先把它转换成右边的矩阵,之后计算对角线上的数字之和:1 + 5 + 9 + 3 + 7 = 25

    解题思路

    1.利用二维数组获取一个矩阵;
    2.对矩阵排序;
    3.计算排序后的矩阵对角线之和;

    源码

    #include<stdio.h>
    
    void getMatrix(int n, int arry[][10]);
    void printMatrix(int n, int arry[][10]);
    void sortMatrix(int n, int arry[][10]);
    int countMatrix(int n, int arry[][10]);
    
    void getMatrix(int n, int arry[][10])
    {
        int i, j;
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
            {
                scanf("%d", &arry[i][j]);
            }
        }
    }
    
    void printMatrix(int n, int arry[][10])
    {
        int i, j;
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
            {
                printf("%-3d", arry[i][j]);
            }
            printf("\n");
        }
    }
    
    void sortMatrix(int n, int arry[][10])//遍历二维矩阵,把大的数放到最后;
    {
        int i, j, k;
        int temp;
        for(k = 0; k < n*n-1; k++)//最少遍历次数为矩阵数字数减一
        {
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < n; j++)
                {
                    if (j < n - 1)//如果要比较的数字不在行末
                    {
                        if (arry[i][j] > arry[i][j + 1])//比较前后两数字,如果前数大就把两数字交换
                        {
                            temp = arry[i][j];
                            arry[i][j] = arry[i][j + 1];
                            arry[i][j + 1] = temp;
                        }
                    }
                    else if (j == n - 1 && i != n - 1)//如果要比较的数字在行末且不在最后一行
                    {
                        if (arry[i][j] > arry[i+1][0])
                        {
                            temp = arry[i][j];
                            arry[i][j] = arry[i + 1][0];
                            arry[i + 1][0] = temp;
                        }
                    }
                }
            }
        }
    }
     
    int countMatrix(int n, int arry[][10])
    {
        int i,result=0;
        for (i = 0; i < n; i++)
        {
            result = arry[i][i] + arry[i][n - i - 1] + result;
        }
        if (n % 2 == 1)
        {
            result -= arry[i / 2][i / 2];  //如果矩阵阶数为奇数的话,此算法会把矩阵中心数据计算两次,需减去一次
        }
        return (result);
    }
    
    void main()
    
    {
        int arry[10][10];
        int n;
        int sum;
        printf("请输入矩阵的阶数:\n");
        scanf("%d", &n);//获得矩阵阶数
        printf("请输入矩阵:\n");
        getMatrix(n, arry);//获得矩阵数据
        printf("排序前的矩阵为:\n");
        printMatrix(n, arry);//打印矩阵现状
        sortMatrix(n, arry);//排序矩阵
        printf("排序后的矩阵为:\n");
        printMatrix(n, arry);//再次打印矩阵现状
        sum = countMatrix(n, arry);//计算对角线之和
        printf("对角线之和为%d\n",sum);
        getchar();
        getchar();
    }
    

    执行结果

    捕获.PNG

    总结

    重新写了一遍;
    优化了排序算法;
    优化了求和算法;
    取消了全局变量.

    相关文章

      网友评论

          本文标题:天花板编程手把手计划-第1期-第1天-打卡

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