方阵的主对角线之上称为“上三角”。
请你设计一个用于填充n阶方阵的上三角区域的程序。填充的规则是:使用1,2,3….的自然数列,从左上角开始,按照顺时针方向螺旋填充。
例如:当n=3时,输出:
1 2 3
6 4
5
当n=4时,输出:
1 2 3 4
9 10 5
8 6
7
当n=5时,输出:
1 2 3 4 5
12 13 14 6
11 15 7
10 8
9
程序运行时,要求用户输入整数n(3~20)
程序输出:方阵的上三角部分。
要求格式:每个数据宽度为4,右对齐。
分析:主要是根据当前数是在第几圈中,其中nTurn是记录当前在第几圈里面。
源代码:
1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 const int M = 22; 7 int martix[M][M] = {0}; 8 9 int N; 10 scanf("%d", &N); 11 12 int front = 1; //当前要填充的数 13 int last = N * (N + 1) / 2; //输入N时,最后一个数的值 14 15 int i, j, nTurn = 0; //nTurn记录当前是在第几圈里面 16 17 while(front <= last) 18 { 19 nTurn++; //每次循环,圈数加1 20 21 i = nTurn; 22 j = nTurn; 23 for(; j <= N - (nTurn - 1) * 2; j++) //填充每一圈的横排 24 { 25 martix[i][j] = front++; 26 } 27 28 i = nTurn + 1; 29 j = N - (nTurn - 1) * 2 - 1; 30 for(; i <= N - (nTurn - 1) * 2 && j>= nTurn; i++, j--)//填充每一圈斜对角线 31 { 32 martix[i][j] = front++; 33 } 34 35 i = N - (nTurn - 1) * 2 - 1; 36 j = nTurn; 37 for(; i >= nTurn + 1; i--) //填充每一圈竖排 38 { 39 martix[i][j] = front++; 40 } 41 } 42 43 for(i = 1; i <= N; i++) 44 { 45 for(j = 1; j <= N - i + 1; j++) 46 { 47 printf("%4d", martix[i][j]); 48 } 49 printf("\n"); 50 } 51 52 return 0; 53 }