Номер элемента в матрице
имеется некоторая матрица, в которой находятся натуральные числа.
Зная число, необходимо найти его координаты в матрице. Элементы размещены таким образом:

На данный момент я нашёл последовательность, которой соответствует номера по крайней верхней горизонтали (1, 3, 4, 10...):
a(n) = if n mod 2 == 0 then n*(n+1)/2, otherwise (n-1)*n/2 + 1.
И крайней левой вертикали (1, 2, 6, 7...):
a(n) = n*(n+1)/2 if n is odd, otherwise (n-1)*n/2 + 1.
Однако пока что не могу додуматься, как это применить.
К примеру, единица в данной матрице имеет координаты [0, 0], а 19 [2, 3] и так далее.
Ответы (2 шт):
Пользуясь этим, этим и этим можно написать следующее:
from math import sqrt
def get_xy(i):
d = int(sqrt(1 + (i - 1) * 8) + 1) // 2 - 1
r = i - d * (d + 1) // 2 - 1
return (r, d - r) if d & 1 else (d - r, r)
i = 44444444447777777777777
p = get_xy(i)
print(i, p)
Вывод:
44444444447777777777777 (103664287789, 194478109221)
Кажется, у меня есть решение, вот код на питоне:
num = int(input())
sum = 1
i = 1
while (num>sum):
i += 1
sum += i
diff = sum - num
if (i%2):
Y = i - diff
X = diff + 1
else:
Y = diff + 1
X = i - diff
Таковым образом мы вычисляем номер диагонали, на которой лежит число (а это полезно, ведь на диагоналях соседние числа отличаются на единицу). Это возможно благодаря тому, что на каждой диагонали лежит на 1 число больше, чем на предыдущей.
Далее, мы смотрим на чётность номера диагонали. По совместительству это количество чисел на диагонали, и простейшим образом вычисляем позицию числа в матрице. Можно поэкспериментировать.