很有意思的题目,先解决了这里的原始问题.Local $iSafeLock = 0
If $iSafeLock = 1 And @Compiled = 0 Then
MsgBox(4096, "tips", "程序未编译,请谨慎执行!")
Exit
EndIf
FileChangeDir(@ScriptDir)
Local $Input
Local $aiResult[2] ;计算结果
$Input = InputBox("趣味算法——螺旋数", "请输入要找位置的数值")
$aiResult = fn_Calc($Input)
MsgBox(4096, "", $aiResult[0] & "," & $aiResult[1])
Exit
Func fn_Calc($Input)
;假设:螺旋数从数字1开始,数字1的坐标是(0,0)
;假设:螺旋数第一步为向正右方,由内向外顺时针旋转
Local $aiResult[2] ;计算结果
Local $iRank = 0 ;螺旋数的阶数
Local $iWay ;控制方向
;计算输入的数值在螺旋数内的阶数
Do
$iRank += 1
Until $iRank^2 >= $Input
;计算螺旋数所在阶数范围内最大数值的坐标
If $iRank/2 <> Int($iRank/2) Then
$iWay = -1 ;奇数时,计算式方向为负
$aiResult[0] = ($iRank-1)/2
$aiResult[1] = ($iRank-1)/2
Else
$iWay = 1 ;偶数时,计算式方向为正
$aiResult[0] = -1 * ($iRank/2 - 1)
$aiResult[1] = -1 * ($iRank/2)
EndIf
;计算输入的数值在螺旋数内的坐标
$iDValue = $iRank^2 - $Input
If $iDValue <= ($iRank^2 - ($iRank - 1)^2)/2 Then
$aiResult[0] += $iWay * $iDValue
Else
$aiResult[0] += $iWay * $iRank - $iWay
$aiResult[1] += $iWay * ($iDValue - $iRank) + $iWay
EndIf
Return($aiResult)
EndFunc
|