C算法编程题(四)上三角

前言

  上一篇《C算法编程题(三)画表格

  上几篇说的都是根据要求输出一些字符、图案等,今天就再说一个“上三角”,有点类似于第二篇说的正螺旋,输出的字符少了,但是逻辑稍微复杂了点。

程序描述

  方阵的主对角线之上称为“上三角”。
    请你设计一个用于填充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,右对齐。

程序实现

   上三角和正螺旋的图形很相似,不同的是上三角输出的图形是从对角线斜过来的。

  接下来,我们看看能不能从上三角图形中找些规律,有规律、把思路理清了,我们才能更容易用程序来实现所需功能。

  首先我们会发现,输出的上三角和我们输入的行有关,如果输入5行,那就15个数,也就是输入N行,就输出N*(N+1)/2个数;其次和正螺旋一样都是依次递增的,从上三角图形我们可以看到,递增分为三个方向;左->右、右上->左下、下->上。

  先贴下代码:

1         for(j=1;j<=N*(N+1)/2;low++,hi--)

2         {

3             for(i=low;i<hi-low;i++)

4                 a[low][i]=j++;

5             for(i=low+1;i<hi-low;i++)

6                 a[i][hi-i-1]=j++;

7             for(i=(hi-low)-2;i>low;i--)

8                 a[i][low]=j++;

9         }

  a表示的是输出的二维数组,N表示输入的行数,hi表示的是列的个数,初始化和N一样,N*(N+1)/2表示的就是上三角的个数,low表示的圈数,这三个for循环的意思就是上面说的三个方向,语句很简单主要是怎么利用参数来表示输出数组的下标。

  话不言多,大家慢慢体会,如果有更好的实现方法,欢迎交流。。。

 

  完整代码:

C算法编程题(四)上三角
 1 #include "stdio.h"

 2 #include "string.h"

 3 #include "stdlib.h"

 4 

 5 int main()

 6 {

 7     int low,i,j,hi,N;

 8     int a[80][80];

 9     while(scanf("%d",&N))

10     {

11         if(N==0)

12             break;

13         low=0;

14         hi=N;

15         for(j=1;j<=N*(N+1)/2;low++,hi--)

16         {

17             for(i=low;i<hi-low;i++)

18                 a[low][i]=j++;

19             for(i=low+1;i<hi-low;i++)

20                 a[i][hi-i-1]=j++;

21             for(i=(hi-low)-2;i>low;i--)

22                 a[i][low]=j++;

23         }

24         for(i=0;i<N;i++)

25         {

26             for(j=0;j<N-i;j++)

27                printf("%4d ",a[i][j]);

28             printf("\n");

29         }

30     }

31     return 0;

32 }
View Code

  运行结果:

 

你可能感兴趣的:(编程)