杰克最近正在努力锻炼他的跳跃技能。当前他正站在X坐标轴原点上。他想跳到坐标(x,0)上,为了达到训练效果,他决定首次跳跃的距离是1,之后每一次跳跃的距离将会比上一次跳跃的距离大1个单位。每一次跳跃,他可以选择往左或者往右跳。他很好奇至少要经过多少次跳跃才能到达终点。
Input
单组测试数据。 输入数据只包含整数x(-10^9<=x<=10^9)。
Output
输出杰克到达终点所需要的最少的跳跃次数。
Input示例
2
Output示例
3
这其实是一道数学题,首先只考虑
终点在他的右方(当然也可以只考虑
终点在他的左方)或者
终点就在原
点。排除原点之后,剩下的就两种方式到达终点(1)一直向右跳直接到终点;(2)在向右跳的过程中有
向左跳的的时候。
无论哪一种种情况一定遵守一条规律:他跳的总数-他到终点需要跳的数=他向左侧跳的数*2;接下来就是
寻找需要跳的最短的次数。
#include<stdio.h>
int main()
{
int i=0,x,num=0;//num作为跳跃的总数
scanf("%d",&x);
if(x==0){printf("0\n");return 0;}//当终点在原点时,直接输出
if(x<0)x=-x;//如果向左跳就视为向右跳同样的距离
while(1)
{
num=num+i;
if(num>=x&&(num-x)%2==0)//跳的总数-到终点跳的数=向左侧跳的数*2
{printf("%d\n",i);return 0;}
i++;
}
return 0;
}