方阵的主对角线之上称为“上三角”。
请你设计一个用于填充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,右对齐。
View Code
1 #include2 #include 3 4 void main() 5 { 6 int count; 7 int *array = NULL; 8 int sum = 0; //数的总和 9 int i; //总的计数 10 int flgRow = 0;//行的标志位 11 int flgInc = 0; //斜的标志位 12 int row = 0, line = 0, inc = 0; //行,列,斜的计数 13 int layer = 0; //层数 14 int k = 0, j = 0; 15 16 scanf ("%d", &count); 17 18 array = (int *)malloc(sizeof(int)*(count+1)*(count+1)); 19 for (k = 0; k <= count; k++) 20 for (j = 0; j <= count; j++) 21 array[k*(count+1)+j] = 0; 22 23 for (i = count; i > 0; i--) 24 sum += i; 25 26 k = 0; 27 j = 0; 28 for (i = 1; i <= sum; i++) 29 { 30 if (flgRow == 0 && flgInc == 0) //如果是行 31 { 32 33 if (row == 0) //判断是不是行的首位 34 { 35 layer++; 36 } 37 38 array[k*(count+1)+j] = i; 39 j++; 40 41 row++; 42 if (row >= count-(layer-1)*3) //如果结束一环 43 { 44 flgRow = 1; 45 k++; 46 j -= 2; 47 row = 0; 48 } 49 } 50 else if (flgRow == 1 && flgInc == 0) //如果是斜 51 { 52 53 array[k*(count+1)+j] = i; 54 k++; 55 j--; 56 57 inc++; //一层的数字 58 if (inc >= count-(layer-1)*3-1) //如果结束一环 59 { 60 flgInc = 1; 61 k -= 2; 62 j++; 63 inc = 0; 64 } 65 } 66 else if (flgRow ==1 && flgInc == 1)//如果是列 67 { 68 69 array[k*(count+1)+j] = i; 70 k--; 71 72 line++; //一层的数字 73 if (line >= count-(layer-1)*3-2) //如果结束一环 74 { 75 flgRow = 0; 76 flgInc = 0; 77 k++; 78 j++; 79 line = 0; 80 } 81 } 82 } 83 84 k = 0; 85 j = 0; 86 while (1)//输出数组 87 { 88 if (k == count-1) //如果结束 89 { 90 printf("\n"); 91 return; 92 } 93 else if (array[k*(count+1)+j] == 0) //如果到每一行的尾端 94 { 95 k++; 96 j = 0; 97 printf ("\n"); 98 } 99 printf ("%4d", array[k*(count+1)+j]); 100 j++; 101 } 102 }