题目
给出任意一个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总结
重新写了一遍;
优化了排序算法;
优化了求和算法;
取消了全局变量.
网友评论