【答案解析】
仔细观察杨慧三角可以看到:
第0列和对角线上的数据全部为1,其余位置上的数据为上一行正对数据与上一行正对前一个数据之和。
比如:a[4][2] = a[3][2] + a[3][1]
【代码实现】
#include<stdio.h> int main() { int array[10][10]; for (int i = 0; i < 10; ++i) { for (int j = 0; j <= i; ++j) { // 对角线和第0列上全部为1 if (i == j || 0 == j) array[i][j] = 1; else array[i][j] = array[i - 1][j] + array[i - 1][j - 1]; } } // 打印杨慧三角的前10行 for (int i = 0; i < 10; ++i) { for (int j = 0; j <= i; ++j) { printf("%5d", array[i][j]); } printf("\n"); } return 0; }【结果截屏】
7. 输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如: 8 1 6 3 5 7 4 9 2要求输出1~$n^2$的自然数构成的魔方阵。
【答案解析】
| 17 | 24 | 1 | 8 | 15 | -------------------------- | 23 | 5 | 7 | 14 | 16 | -------------------------- | 4 | 6 | 13 | 20 | 22 | -------------------------- | 10 | 12 | 19 | 21 | 3 | -------------------------- | 11 | 18 | 25 | 2 | 9 |仔细观察上述矩阵,可以看到以下规律:
魔方阵的生成方法为:在第0行中间置1,对从2开始的其余$n^2-1$个数依次按下列规则存放:
将1放在第1行的中间一列。
从2开始直到n*n止,各数依次按此规律存放:每一个数存放的行比前一个数的行数减1,列数加1。
如果上一行的行数为1,则下一个数的行数为n(指最下一行)。
当上一个数的列数为n时,下一个数的列数应该为1。
如果按上面规律确定的位置有数,或者上一个数是第1行第n列时,则把下一个数放在上一个数的下面。
【代码实现】
#include <stdio.h> int main() { int a[15][15], n, i, j, k; while (1) { printf("请输入n(1~15):"); scanf("%d", &n); if (n != 0 && n <= 15 && n % 2 != 0) break; else { printf("请输入奇数\n"); } } for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) a[i][j] = 0; } j = n / 2 + 1; a[1][j] = 1; i = 1; for (k = 2; k <= n*n; k++) { i -= 1; j += 1; if (i<1 && j>n) { i += 2; j -= 1; } else if (i<1) { i = n; } else if (j>n) { j = 1; } if (a[i][j] == 0) { a[i][j] = k; } else { i += 2; j -= 1; a[i][j] = k; } } for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) printf("%5d", a[i][j]); printf("\n"); } return 0; }【结果截屏】
8. 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点。【答案解析】
鞍点是行上最大,列上最小的元素,因此对数组的第i元素进行如下操作:
找到该行上最大元素,用max标记,并标记该元素所在列colindex
找colindex列上最小的元素,用min标记,并标记该元素所在行号rowindex
如果max和min相等,并且最小的元素刚好是在第i行,则为鞍点
如果所有行找完了,没有输出则没有鞍点
【代码实现】
#include<stdio.h> #define M 3 #define N 4 int main() { int max, min, rowindex, colindex, flag = 0; int array[M][N]; printf("请输入%d行%d列的数组:\n", M, N); for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) scanf("%d", &array[i][j]); } for (int i = 0; i < M; ++i) { // 找到i行上最大的元素,记录该元素在列号colindex max = array[i][0]; for (int j = 0; j < N; ++j) { if (array[i][j] > max) { max = array[i][j]; colindex = j; } } // 找max所在列colindex上最小的元素,并记录其所在的行 min = array[0][colindex]; for (int j = 0; j < M; ++j) { if (array[j][colindex] < min) { min = array[j][colindex]; rowindex = j; } } // 如果最小元素与最小元素相同,并且最小元素也在第i行,则为鞍点 if (max == min && i == rowindex) { flag = 1; printf("鞍点为:%d行%d列的元素%d", rowindex, colindex, max); break; } } if (0 == flag) printf("没有鞍点"); return 0; }【结果截屏】