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

dext 2013-06-26 05:13:38
有一个可以向两边无限延伸的数轴,有一个指针指向零点。第一次可以向左或向右移动一格,第二次可以向左或向右移动两格,第三次可以向左或向右移动三格。

给出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 点 对称的。
...全文
365 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pcvvv 2013-06-27
  • 打赏
  • 举报
回复
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
pcvvv 2013-06-27
  • 打赏
  • 举报
回复
写错了 lab:和 b=floor(a)+1 这2行对调下
引用 3 楼 dext 的回复:
楼上的算法完全看不懂,b=b+1后,然后又b = floor(a)+1 翻来覆去就是死循环。 [quote=引用 2 楼 pcvvv 的回复:]
解方程(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
格式没了 再发一次
[/quote]
nice_cxf 2013-06-27
  • 打赏
  • 举报
回复
其实很简单, 如果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
keeya0416 2013-06-27
  • 打赏
  • 举报
回复
dext 2013-06-26
  • 打赏
  • 举报
回复
楼上的算法完全看不懂,b=b+1后,然后又b = floor(a)+1 翻来覆去就是死循环。
引用 2 楼 pcvvv 的回复:
解方程(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
格式没了 再发一次
pcvvv 2013-06-26
  • 打赏
  • 举报
回复
解方程(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
格式没了 再发一次
pcvvv 2013-06-26
  • 打赏
  • 举报
回复
解方程(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 纯属yy 只验证了前面几个比较小的数

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧