Math 确定数字在以0为中心并以螺旋线递增的数字网格中的位置

Math 确定数字在以0为中心并以螺旋线递增的数字网格中的位置,math,Math,我得到了以下以0为中心的数字网格,并以螺旋形式递增。我需要一个算法,它将接收螺旋中的数字并返回x;y-从0到该数字的移动次数。例如,对于数字9,它将返回-2-1.对于4,则为1;一, 25|26|... etc. 24| 9|10|11|12 23| 8| 1| 2|13 22| 7| 0| 3|14 21| 6| 5| 4|15 20|19|18|17|16 如果这有助于改进算法,则可以稍微改变此螺旋。 用你喜欢的任何语言。我非常感谢数学解释 谢谢。你是说这样的事吗?我没有实现任何算法,代码

我得到了以下以0为中心的数字网格,并以螺旋形式递增。我需要一个算法,它将接收螺旋中的数字并返回x;y-从0到该数字的移动次数。例如,对于数字9,它将返回-2-1.对于4,则为1;一,

25|26|... etc.
24| 9|10|11|12
23| 8| 1| 2|13
22| 7| 0| 3|14
21| 6| 5| 4|15
20|19|18|17|16
如果这有助于改进算法,则可以稍微改变此螺旋。 用你喜欢的任何语言。我非常感谢数学解释


谢谢。

你是说这样的事吗?我没有实现任何算法,代码可以写得更好,但它可以工作-这始终是一个开始:)只要根据您的意愿更改阈值,您就会得到结果

static int threshold=14, x=0, y=0;

    public static void main(String[] args) {

        int yChange=1, xChange=1, count=0;
        while( !end(count) ){

            for (int i = 0; i < yChange; i++) {
                if( end(count) )return;
                count++;
                y--;
            }
            yChange++;
            for (int i = 0; i < xChange; i++) {
                if( end(count) )return;
                count++;
                x++;
            }
            xChange++;
            for (int i = 0; i < yChange; i++) {
                if( end(count) )return;
                count++;
                y++;
            }
            yChange++;
            for (int i = 0; i < xChange; i++) {
                if( end(count) )return;
                count++;
                x--;
            }
            xChange++;

        }

    }

    public static boolean end(int count){
        if(count<threshold){
            return false;
        }else{
            System.out.println("count: "+count+", x: "+x+", y: "+y);
            return true;
        }
    }
static int threshold=14,x=0,y=0;
公共静态void main(字符串[]args){
int yChange=1,xChange=1,count=0;
而(!结束(计数)){
for(int i=0;i如果(count首先我们需要确定我们所处的周期(距中心的距离)和扇区(北、东、南或西),然后我们可以确定数字的确切位置

  • 每个循环中的第一个数字如下:
    1、9、25

  • 这是一个二次序列:
    first(n)=(2n-1)^2=4n^2-4n+1

  • 与之相反的是循环编号:
    cycle(i)=floor((sqrt(i)+1)/2)

  • 循环的长度为:
    length(n)=first(n+1)-first(n)=8n

  • 然后,该扇区将为:
    扇区(i)=楼层(4*(i-第一周期(i))/长度(周期(i))

  • 最后,为了得到位置,我们需要从周期和扇区中第一个数字的位置进行推断

总而言之:

def first(循环):
x=2*循环-1
返回x*x
def循环(索引):
返回(isqrt(索引)+1)//2
def长度(循环):
返回8*周期
def扇区(索引):
c=循环(索引)
偏移=索引-第一(c)
n=长度(c)
返回4*offset/n
def位置(索引):
c=循环(索引)
s=行业(指数)
偏移量=索引-第一个(c)-s*长度(c)//4
如果s==0:#北
返回-c,-c+偏移量+1
如果s==1:#东
返回值-c+偏移量+1,c
如果s==2:#南
返回c,c-偏移量-1
#否则,西部
返回c-偏移量-1,-c
def isqrt(x):
“”“计算数字的整数平方根”“”
如果x<0:
raise VALUERROR('未定义负数的平方根')
n=int(x)
如果n==0:
返回0
a、 b=divmod(n.位长度(),2)
x=2**(a+b)
尽管如此:
y=(x+n//x)//2
如果y>=x:
返回x
x=y
示例:

>位置(9)
(-2, -1)
>>>职位(4)
(1, 1)
>>>职位(123456)
(-176, 80)

Hmm,我不知道怎么做。只是更多的例子:1=>[x:-1;y:0],2=>[x:-1;y:1],17=>[x:2;y:1]。换句话说:“当输入为17时,需要向下走两步(在x轴上)和向右走一步(在y轴上)。我想知道如何获得这些距离。(我错误地交换了x和y,我使用x作为垂直轴,y作为水平轴)。为什么我需要这个?我知道围绕某个点(“0”)的项目数这是一个有一些有趣的性质,如果你画出素数在上面的位置。看起来很有趣。我很难把它改写成PHP(并证明和接受)-它对我不起作用。有人能看一下这个转录吗?谢谢。我设法在Python 3中运行了这个。结果是(-2,-1),(0,-1),(175,-176)与您的输入相同。非常奇怪。