Math 确定数字在以0为中心并以螺旋线递增的数字网格中的位置
我得到了以下以0为中心的数字网格,并以螺旋形式递增。我需要一个算法,它将接收螺旋中的数字并返回x;y-从0到该数字的移动次数。例如,对于数字9,它将返回-2-1.对于4,则为1;一,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 如果这有助于改进算法,则可以稍微改变此螺旋。 用你喜欢的任何语言。我非常感谢数学解释 谢谢。你是说这样的事吗?我没有实现任何算法,代码
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)与您的输入相同。非常奇怪。