Appearance
题目
将一个 对称矩阵 的上三角部分的元素 (),按列优先存入 C 语言的一维数组 中,元素 在 中的下标是( )。
错因
A
按"行优先存上三角"算的下标。误以为题目是行优先,套了 1-based 行优先公式 ()。问题在于把 "列优先" 看成 "行优先",存储顺序整个搞反。
B
同样是按"行优先存上三角"算,但下标从 1 开始:。比 A 又多偏 1,错因相同——没注意题面明确写的是"列优先",C 语言数组下标必须从 0 算起。
D
公式对了(列优先存上三角:前 列共 个元素,再加列内偏移),但下标从 1 开始:。C 语言数组下标从 0 开始,应再减 1。
总解析
第一步:用对称性把元素挪到上三角。
题目要求 才存进 ,而 的行号 大于列号 ,落在下三角。利用对称矩阵的性质 :
所以实际查的是 、 这个上三角元素的下标。
第二步:列优先下标公式。
按列优先存上三角,第 列含 个元素()。元素 之前已经存了:
- 前 列: 个元素;
- 第 列内 之前: 个元素。
C 语言数组下标从 0 开始,所以:
第三步:代入 。
最终答案是 C(22)。
易错点:① 忘了用对称性把 转成 ;② "列优先"还是"行优先"看错;③ 下标 1-based 还是 0-based 弄错(C 语言一定是 0-based)。