Appearance
题目
设有一个12×12的对称矩阵M,将其上三角部分的元素mi,j(1≤i≤j≤ 12)按行优先存入 C 语言的一维数组N中,元素m6,6在N中的下标是( )。
错因
B
下标和"序号"差 1。前 5 行已经放了 50 个元素,第 6 行第 1 个就是 ——它是第 51 个元素,但 C 语言数组下标从 0 开始,对应下标是 50。选 51 的人是把"第几个"当成了"下标几",没有把 1-based 序号转换到 0-based 下标。
C
把上三角的行长当成了"先 1 后多"——从第 1 行 1 个、第 2 行 2 个……第 6 行 6 个累加:,再在末尾加 4 行 8.5 个的某种凑数得 55;或者把"上三角"误存成了"下三角"按 算第 6 行第 6 列: 再补成 55。本质是把"上三角行优先"和"下三角行优先"两个公式混淆了:上三角第 行长度是 (递减),下三角第 行长度才是 (递增)。
D
是整个上三角(不含对角线)的元素总数,根本不是某一个元素的下标。选 D 的人多半是看见"对称矩阵 12×12"就直接套公式,没注意题目问的是" 的下标"。
总解析
目标:把 () 按行优先压进一维数组 ,问 在 里的下标(C 语言下标从 0 开始)。
上三角行优先存储的关键:第 行存放 ,共 个元素。
记 。第 行的元素个数:
| 行 i | 1 | 2 | 3 | 4 | 5 | 6 | … |
|---|---|---|---|---|---|---|---|
| 元素个数 | 12 | 11 | 10 | 9 | 8 | 7 | … |
前 5 行总元素数:
第 6 行的第一个元素恰好就是 (因为只存 的部分),所以它是数组中的第 51 个元素。C 语言下标从 0 计起,对应下标是:
也可以用通用公式 ,代入 :
最终答案是 A(50)。