这道面试题是网上找的,不知道是否真的是有道的笔试题。
------------------------------------------------------------------
打印 如下形式 的矩阵;
n=5:
1 2 9 10 25
4 3 8 11 24
5 6 7 12 23
16 15 14 13 22
17 18 19 20 21
n=6:
1 2 9 10 25 26
4 3 8 11 24 27
5 6 7 12 23 28
16 15 14 13 22 29
17 18 19 20 21 30
36 35 34 33 32 31
--------------------------------------------------------------------
解题思路:
1. 假设数组的编号从1开始
2. 则对角线上的元素值为: a[i][i]= i*i-i+1;
如果i为奇数,则a[i][i]上方的元素依次递增,左侧元素依次递减;
如果i为偶数,则a[i][i]上方的元素依次递减,左侧元素依次递增;
优化后的代码:
int compute(int i,int j)
{
int max = i>j?i:j;
if (max%2)
return max*max -max +1 -(i-j);
else
return max*max -max +1 +(i-j);
}
void printMatrix2(int n)
{
for(int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
printf("%2d ", compute(i,j));
}
printf("\n");
}
}
int main(int argc, char* argv[])
{
printMatrix2(6);
return 0;
}