例:编写算法,打印具有下面规律的图形
1
5 2
8 6 3
10 9 7 4
简单算法设计1: 通过观察发现,用二维数组表示。在赋值时,需按照 1 2 3 4 的规律去赋值。那么需要变换的是行数和列数。
赋值 行数 列数
1 1 1
2 2 2
3 3 3
4 4 4
5 2 1
6 3 2
7 4 3
。。。。。。。。
10 4 1
归纳出来,对行和列进行循环,设计算法如下:
#include "stdafx.h" #include <stdio.h> #define ROW 5 void main() { int pA[ROW][ROW] = {0}; int i, j, k, l=0; for(i=0, j=0, k = 1; k <= (1+ROW)*ROW/2; k++) //这里我觉得可以改为 for(i=0, j=0, k = 1; i<=ROW; k++) 即可 { pA[i][j] = k; i++; j++; if(i>=ROW){i = ++l, j=0;} } for(i=0; i<ROW; i++) for(j=0; j<ROW; j++) if(pA[i][j]) printf("%-4d ",pA[i][j]); else{printf("\n"); break;} }
算法设计2:如果不对行和列进行循环,对于层循环呢?所谓层 就是 把 1234 当作一层,5 6 7 当作一层,7 8 当作一层,来进行操作,是否可行呢?
答案是可以的。
值 层数 层里的列数
1 1 1
2 1 2
3 1 3
4 1 4
5 2 1
6 2 2
7 2 3
8 3 1
。。。。。。
10 4 1
共有 n 层 ,每一层比上一层少一个数。
但还是要二维数组来存贮。
第 i 层 j 个数 对应数组元素a【i+j-1】【j】。
代码如下:
oid main() { int i,j,n = 1,a[4][4] ; for(i = 0; i < 4; i++) //层数 for(j = 0; j < 4 - i; j++) //每层中的个数 a[i+j][j] = n++;
for(i = 0; i < 4;i++) { for(j = 0; j <= i; j++) printf("%d\t",a[i][j]); printf("\n"); } }
个人觉得:算法一,比较直接。算法二看似简单,实则比较绕,因为最终还是要用二维数组来表达。