题目要求构造一个 (n) 行 (m) 列的矩阵,并且满足:
通过观察题目给出的提示:在第 (i) 行第 (j) 列填入 (i \times j)。我们可以验证:
因此,直接按照 (a_{i,j} = i \times j) 构造即可满足要求。题目要求输出整个矩阵,元素之间用空格隔开。
根据上述分析,本题是一个简单的模拟题。我们只需要嵌套两层循环:
注意输出格式:同一行的整数之间用空格分割,不能有多余的空格;每输出完一行要进行换行。
算法步骤:
下面给出完整的 C++ 参考代码,并附有详细注释。
cpp1#include <bits/stdc++.h> 2using namespace std; 3 4int n, m; 5 6int main() { 7 // 读入行数和列数 8 scanf("%d%d", &n, &m); 9 10 // 按照 i * j 构造矩阵 11 for (int i = 1; i <= n; i++) { // 遍历每一行 12 for (int j = 1; j <= m; j++) { // 遍历每一列 13 // 输出 i * j,并根据 j 是否为最后一列来决定输出空格还是换行 14 // " \n" 是一个长度为2的字符串," \n"[0] = ' '," \n"[1] = '\n' 15 printf("%d%c", i * j, " \n"[j == m]); 16 } 17 } 18 19 return 0; 20}
输入输出方式
使用 scanf 和 printf 进行输入输出,效率较高,适合 OI 比赛使用。
也可以用 cin / cout,但建议在包含大量输出时关闭同步流以提高速度。
控制行末格式
" \n"[j == m] 是一个巧妙写法:
j == m 时,条件为真,值为 1,取字符串下标 1,即 '\n',实现换行。j != m 时,条件为假,值为 0,取下标 0,即 ' ',输出空格。数据范围
题目未明确给出 (n, m) 的上限,但从注释中可以看出可能不超过 (50)。即使范围较大(如几百),(O(nm)) 的算法也非常高效。
本题考察了等差数列的基本概念和简单的循环输出。只要意识到 (a_{i,j} = i \times j) 的性质,就能轻松解决。对于初学者来说,这是练习嵌套循环和格式控制的绝佳题目。