美文网首页
天花板编程手把手计划-第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