如何实现指定模式的10×10二维数组?现有JS对角线代码无效
生成指定模式的10×10二维数组
问题描述
需要生成如下模式的10×10二维数组:
1 0 0 0 1 0 0 0 1 0 0 4 0 0 0 4 0 0 0 4 0 0 9 0 0 0 9 0 0 0 0 0 0 16 0 0 0 16 0 0 1 0 0 0 25 0 0 0 25 0 0 4 0 0 0 36 0 0 0 36 0 0 9 0 0 0 49 0 0 0 0 0 0 16 0 0 0 64 0 0 1 0 0 0 25 0 0 0 81 0 0 4 0 0 0 36 0 0 0 100
我原本尝试用对角线模式实现,但生成结果不符合预期,代码如下:
function matrixPattern() { let arr = []; let len = 10; for (let i = 0; i < len; i++) { arr[i] = []; for (let j = 0; j < len; j++) { arr[i][j] = i !== j ? 0 : (i + 1) * (j + 1) } } for (let i in arr) { let line = ''; for (let j in arr[i]) { line += arr[i][j] + '\t'; } console.log(line); } } matrixPattern()
观察目标模式可知,对角线数值会在间隔3个零后重复出现,请问该如何修改代码实现这个模式?
解决方案
规律分析
目标数组的非零值满足两个核心规则:
- 位置规则:
j % 4 === i % 4,即列索引对4取余的结果等于行索引对4取余的结果,实现每4列重复一次相同的列模式。 - 数值规则:非零值是递增的平方数,每个周期(4列)内的数值对应
(周期数×4 + 行基准偏移 +1)²,其中周期数为Math.floor(j/4),行基准偏移为i%4。
修改后的代码
function matrixPattern() { let arr = []; let len = 10; for (let i = 0; i < len; i++) { arr[i] = []; const rowMod = i % 4; // 行索引对4取余,确定当前行的基准位置 for (let j = 0; j < len; j++) { if (j % 4 === rowMod) { // 计算当前位置的平方值 const cycle = Math.floor(j / 4); arr[i][j] = Math.pow(cycle * 4 + rowMod + 1, 2); } else { arr[i][j] = 0; } } } // 格式化输出,对齐数值 for (let i = 0; i < len; i++) { let line = ''; for (let j = 0; j < len; j++) { line += arr[i][j].toString().padStart(4, ' '); } console.log(line); } } matrixPattern()
关键逻辑说明
- 位置判断:通过
j % 4 === rowMod精准定位非零值的位置,确保每4列重复一次相同的列分布。 - 数值计算:结合列的周期数和行的基准偏移,生成递增的平方数,匹配目标数组的数值规律。
- 格式化输出:使用
padStart方法让每个数值占4位宽度,输出效果与目标数组完全对齐。
内容的提问来源于stack exchange,提问作者Dennis-The14th-Web
相关产品推荐
相关产品推荐

