上三角

方阵的主对角线之上称为“上三角”。

请你设计一个用于填充n阶方阵的上三角区域的程序。填充的规则是:使用123….的自然数列,从左上角开始,按照顺时针方向螺旋填充。

例如:当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

程序运行时,要求用户输入整数n3~20

程序输出:方阵的上三角部分。

要求格式:每个数据宽度为4,右对齐。

 

View Code
  1 #include <stdio.h>
2 #include <malloc.h>
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 }



posted @ 2012-03-20 22:56  天已界  阅读(900)  评论(0编辑  收藏  举报