由具体到抽象设计循环结构
1
5 2
8 6 3
10 9 7 4
问题分析:容易发现图形中数据排列的规律。
方法一:
先用一个数组按此顺序存储数据,再正常输出;
用斜行、列描述新的循环方向。 斜行i取值(1~n) 列j取值(1~n+1-i)
关键问题:第i斜行、j列的数据对应于第几行第几列的元素
斜[1,1]—a[1,1] 斜[2,1]—a[2,1] 斜[3,1]—a[3,1] 斜[4,1]—a[4,1]
斜[1,2]—a[2,2] 斜[2,2]—a[3,2] 斜[3,2]—a[4,2]
斜[1,3]—a[3,3] 斜[2,3]—a[4,3]
斜[1,4]—a[4,4]
à列号相同;
à行号(显然行号与列号有关)
第1斜行,对应行号1—n,行号与列号j同;
第2斜行,对应行号2—n,行号比列号j大1;
第3斜行,对应行号3—n,行号比列号j大2;
代码如下:
2 using namespace std;
3 int main()
4 {
5 int i,j,k,n,a[100][100];
6 while(cin>>n)
7 {
8 k=1;
9 for(i=1;i<=n;i++)
10 for(j=1;j<=n+1-i;j++)
11 {
12 a[i-1+j][j]=k;
13 k++;
14 }
15 for(i=1;i<=n;i++)
16 {
17 for(j=1;j<=i;j++)
18 if(j==1) cout<<a[i][j];
19 else cout<<" "<<a[i][j];
20 cout<<endl;
21 }
22 cout<<endl;
23 }
24 return 0;
25 }
方法二:
还是考虑从数据间找规律
首先主对角线元素与其数组下标数值一致。如a[3][3]=3
沿紫色箭头看,每条斜线数据与其上方斜线数据所差数值相同,且差值为上方斜线包含的数的个数。
由于是斜线方向的规律,循环如按行处理,仍然不能简单构造循环体。[可行,但相对复杂]
再观察,对于3条相邻斜线上数值的差,正好相差1。[为什么?]因此如果循环如按列处理,可得到同一列相邻元素间关系
a[i][j]=a[i-1][j]+k;k随矩阵行号增加递减。
为什么相差1?由每个对角线包含数据个数决定。
代码如下:
2 //#include<string>
3 using namespace std;
4 int main()
5 {
6 int i,j,n,a[100][100],k;
7 //memset(a,0,sizeof(a));
8 while(cin>>n)
9 {
10 for(i=1;i<=n;i++)
11 a[i][i]=i;
12 for(j=1;j<=n;j++)
13 {
14 k=n;
15 for(i=j+1;i<=n;i++)
16 {
17 a[i][j]=a[i-1][j]+k;
18 k--;
19 }
20 }
21 for(i=1;i<=n;i++)
22 {
23 for(j=1;j<=i;j++)
24 if(j==1) cout<<a[i][j];
25 else cout<<" "<<a[i][j];
26 cout<<endl;
27 }
28 cout<<endl;
29 }
30 return 0;
31 }