题目:
给出任意一个N*N的矩阵,将里面的数字按照从左上到右下有小到大排序,之后计算出新矩阵对角线上的数字总和(每个位置只参与一次计算)。例如:
145902-813936ab7b282e90.jpg
解题思路:
1.将N*N矩阵里的数据按一维数组输入 2.再按冒泡法进行排序 3.将一维数组转化为为二维数组(矩阵)4.分奇偶计算对角线之和
源码:
#include <stdio.h>
#define N 4
void main()
{
int i,j,t,a[50],b[N][N],sum=0;
//按一维数组输入
printf("N=%d\n",N);
printf("请输入N*N个数据:");
for(i=0;i<N*N;i++)
scanf("%d",&a[i]);
//冒泡法排序
for(i=1;i<N*N;i++)
{
for(j=0;j<N*N-i;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
printf("排序后得数据为:");
for(i=0;i<N*N;i++)
printf(" %d",a[i]);
printf("\n\n");
//转化为二维数组
printf("转化为矩阵为:\n");
for(i=0;i<N*N;i++)
{
b[i/N][i%N]=a[i];
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%3d",b[i][j]);
}
printf("\n");
}
//计算对角线之和
for(i=0;i<N;i++)
sum+=b[i][i]+b[i][N-1-i];
if(N%2==1)
sum-=b[N/2][N/2];
printf("对角线之和为 %d\n",sum);
}
执行结果:
aa.jpg
总结:
提到排序,就只想到冒泡法(也只学了冒泡法),而冒泡法针对二维数组就比较麻烦(自己可能也不太会控制),就又把数据转化为一维再比较。
整体上觉得自己的方法很麻烦,更多排序方法有待提高。程序的简化也需要自己思考。