有一个可以向两边无限延伸的数轴,有一个指针指向零点。第一次可以向左或向右移动一格,第二次可以向左或向右移动两格,第三次可以向左或向右移动三格。解决方法

有一个可以向两边无限延伸的数轴,有一个指针指向零点。第一次可以向左或向右移动一格,第二次可以向左或向右移动两格,第三次可以向左或向右移动三格。
本帖最后由 dext 于 2013-06-26 09:06:40 编辑
有一个可以向两边无限延伸的数轴,有一个指针指向零点。第一次可以向左或向右移动一格,第二次可以向左或向右移动两格,第三次可以向左或向右移动三格。

给出X ( -10 ^ 9 < X  < 10 ^ 9) 求 指针移到 X 需要 最少 几次移动(N)。

X = 1, N = 1
X = 2, N = 3
X = 3, N = 2
X = 4, N = 3
X = 5, N = 5

是关于 0 点 对称的。
------解决方案--------------------
其实很简单,
如果X为奇数,n满足以下两个条件:
1。1-(n-1)中奇数的数目为奇数个
2。满足条件1的最小n,保证1+2+...+(n-1)>=n
如果X为偶数,n满足以下两个条件:
1。1-(n-1)中奇数的数目为偶数个
2。满足条件1的最小n,保证1+2+...+(n-1)>=n

------解决方案--------------------

写错了 有一个可以向两边无限延伸的数轴,有一个指针指向零点。第一次可以向左或向右移动一格,第二次可以向左或向右移动两格,第三次可以向左或向右移动三格。解决方法
lab:和    b=floor(a)+1 这2行对调下  
引用:
楼上的算法完全看不懂,b=b+1后,然后又b = floor(a)+1 翻来覆去就是死循环。


Quote: 引用:

解方程(1+a)*a/2=N
得a
if a==floor(a)
return a
else
lab:
b=floor(a)+1
c=(1+b)*b/2-N;
if c%2==0
return b
else
b=b+1 //N和b都是偶数的话可以加2 
goto lab

格式没了 再发一次

------解决方案--------------------
1.解方程(1+a)*a/2=N得正数解a
2.如果a是整数,结果就是a
3.如果a不是整数,取大于a的最小整数,记作b
4.c=(1+b)*b/2-N;
5.如果c是偶数,结果就是b
6.如果c不是偶数 b++,跳转到步骤4

N=12
1.a=4.4244
2.b=5
3.不成立
4.c=6*5/2-12=3
5.不成立
6.b=6  转到步骤4

4.c=7*6/2-12=9
5.不成立
6.b=7  转到步骤4

4.c=8*7/2-12=16
5.ok
12=1+2-3+4-5+6+7