You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求无限矩阵对角线遍历序列的第n个坐标的公式或算法

求无限矩阵对角线遍历序列的第n个坐标的公式或算法

嘿,这个问题我太熟了!你说的这种遍历方式其实是按对角线分组来走的:每一组对角线上的坐标都满足 x + y = s(s从0开始递增),而且每组里的坐标是从(s, 0)往(0, s)依次排列的。咱们一步步拆解出公式:

第一步:找到n所在的对角线s

首先,前s条对角线(从s=0到s=s-1)的总元素个数是等差数列求和:1 + 2 + ... + s = s*(s+1)/2,这个值就是第s条对角线的起始序号(比如s=2的起始序号是3,对应坐标(2,0))。

要找到n对应的s,只需要解不等式:
s*(s+1)/2 ≤ n
解这个二次不等式,就能得到s的计算公式:
s = floor( (sqrt(8n + 1) - 1) / 2 )
这里的floor是向下取整,用Python里的math.floor()或者直接用整数除法都可以。

第二步:计算n在对角线上的偏移量

找到s之后,这条对角线的起始序号是start = s*(s+1)//2,那么n在这条对角线上的位置偏移量就是:
offset = n - start

第三步:推导坐标值

因为这条对角线上的坐标是从(s, 0)开始,每往后一个位置,x减1、y加1,所以对应的坐标就是:
(s - offset, offset)

直接可用的Python实现

把上面的逻辑写成函数,测试一下完全符合你的序列:

import math

def get_nth_pair(n):
    s = math.floor( (math.sqrt(8 * n + 1) - 1) / 2 )
    start = s * (s + 1) // 2
    offset = n - start
    return (s - offset, offset)

验证几个例子

  • n=0 → (0, 0) ✔️
  • n=5 → (0, 2) ✔️
  • n=10 → (4, 0) ✔️
  • n=14 → (0, 4) ✔️

另外你提到的生成函数,其实逻辑是对的——它是按对角线从s=0开始生成,每一条对角线对应循环里的i(i = s+1),总元素数确实是m*(m-1)/2 -1,和你观察到的一致。

备注:内容来源于stack exchange,提问作者user695931

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 12:29:34