首页 > 试题广场 >

跳跃的蚂蚱

[问答题]

跳跃的蚂蚱


【题目描述】

小B对脑筋急转弯问题很有兴趣,她觉得这种问题的挑战能够反映一个人的应急反应能力。她正在开发一个智力测试的游戏,游戏的主角是一个蚂蚱。蚂蚱最初位于0点处,可以在直线上向正向或反向两个方向跳跃。比较特别的是,蚂蚱每次跳跃的距离比前一次跳跃多一个单位,第一次跳跃的距离为一个单位。

小B的问题是,如果让蚂蚱跳跃到x处,需要经过多少次跳跃,你能解决这个问题吗?

输入

输入中有多组测试数据。每组测试数据为单独的一行,包含一个整数x(-10^9 =< x =< 10^9)。

输出

对每组测试数据,在单独的行中输出蚂蚱最少需要跳跃的次数。

样例输入

2

6

0

样例输出

3

3

0

import java.util.Scanner;  /**  * Created by Administrator on 2017-08-08.  */ public class Main{ public static void main(String[] args) {
        Scanner in = new Scanner(System.in);  String str;  while((str=in.nextLine()) != null && str.length() != 0) { int n = Integer.parseInt(str);  int i = (int) Math.sqrt(1 + 8*n);  System.out.println( i*i == 1 + 8*n ? (i-1)/2 :2*(n-1) + 1);  }
        in.close();  }
}
发表于 2017-08-08 22:35:08 回复(1)
Aji头像 Aji
import java.util.Scanner;
/**
蚂蚱最初位于0点处,可以在直线上向正向或反向两个方向跳跃。比较特别的是,
蚂蚱每次跳跃的距离比前一次跳跃多一个单位,第一次跳跃的距离为一个单位。           
小B的问题是,如果让蚂蚱跳跃到x处,需要经过多少次跳跃,你能解决这个问题吗?   
  输入     输入中有多组测试数据。每组测试数据为单独的一行,包含一个整数x(-10^9 =< x =< 10^9)。     
  输出     对每组测试数据,在单独的行中输出蚂蚱最少需要跳跃的次数。
             
  样例输入     2     6     0     
  样例输出     3     3     0        

 *
 * 思路:
 * 定义一个记录蚂蚱当前所在位置的比变量location,一个当前能够跳跃的距离step。
 * 开始让蚂蚱一直往x所在方向向前跳,在跳下一步之前先判断当前所处的位置加上下一步要跳的距离是否会超过所要到的位置,
 *  要是不超过(location < x),继续向前跳:location += step;step++
 *  要是超过了(location > x), 就反方向跳:location -= step;step++
 *  直到 location == x.
 */
public class GrassShopperJump {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		
		while(in.hasNext()) {
			int x = in.nextInt(); //蚂蚱要跳到的位置
			
			countJump(x);
		}
		in.close();
	}

	private static void countJump(int x) {

		int location = 0; //当前蚂蚱所处的位置
		int step = 1; //当前跳跃的距离
		x = Math.abs(x); //正、负方向都换到正方向来计算
		while(location < x) {
			if(location + step > x) { //如果超过x的位置
				location -= step; //向反方向跳
				step++;
			} 
			//一直向x所在的方向跳
			location += step; 			
			step++; //每次跳跃距离加1
			if(location == x)
				break;
		}
		System.out.println(step-1);
	}

}

发表于 2017-08-09 15:43:43 回复(7)
java实现:
public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要到达的点x:");
        long x = scanner.nextLong();
        System.out.println("需要跳"+jumpTimes(x)+"次才能到达"+x+"点");
    }
    private static int jumpTimes(long x){
        int time=0;
        for (int i = 0; i <= x; i++) {
            if (i*(i+1)/2<=x){
                time=i;
            }else {
                time+=(x-(i*(i-1)/2))*2;
                break;
            }
        }
        return time;
    }

请输入要到达的点x:
34
需要跳19次才能到达34点
发表于 2019-09-08 11:11:36 回复(0)
通过题意画出跳跃的曲线图,得出函数
发表于 2018-02-28 10:14:46 回复(0)
#include <iostream>
using namespace std;
int m;
int i, sum, k;
int main()
{
while ((cin >> m) )
{
if (m == 0) 
cout << m << endl;
              k = 0;
     sum = 0;
for (i = 1;; i++)
{
sum += i;// 0 1 1 3 6 2
k++;
if (sum == m) 
break;
if (sum - i - 1 == m)
break;
}
if (sum == m || sum - i - 1 == m)
cout << k << endl;
}
return 0;
}
发表于 2017-08-17 10:56:47 回复(0)
/*跳跃的蚂蚱 【题目描述】 B对脑筋急转弯问题很有兴趣,她觉得这种问题的挑战能够反映一个人的应急反应能力。  她正在开发一个智力测试的游戏,游戏的主角是一个蚂蚱。  蚂蚱最初位于0点处,可以在直线上向正向或反向两个方向跳跃。  比较特别的是,蚂蚱每次跳跃的距离比前一次跳跃多一个单位,第一次跳跃的距离为一个单位。 B的问题是,如果让蚂蚱跳跃到x处,需要经过多少次跳跃,你能解决这个问题吗?  输入  输入中有多组测试数据。每组测试数据为单独的一行,包含一个整数x-10^9 =< x =< 10^9)。  输出  对每组测试数据,在单独的行中输出蚂蚱最少需要跳跃的次数。*/ package 乐视2017; import java.util.Scanner; /**  * Created by JackHui on 2017/8/9.  */ public class no3 { public static void main(String[] args)
    {
        Scanner s=new Scanner( System.in ); int x=s.nextInt(); int step=1,length=0; int count=0; while(length<x)
        { if(length+step>x)
            { length=length-step;
                step+=1;
                count+=1;
            } length+=step;
            step+=1;
            count+=1; if(length==x)
            { break;
            }
        }
        System.out.println(count);
    }
}

发表于 2017-08-09 11:57:49 回复(1)
#include <iostream>
#include <stdio.h>
using namespace std;

#define myabs(a, b) a-b>0? a-b: b-a
int jump(int def){
int step = 1;
int cur = 0;
if (cur == def)
return 0;
while (step){
if (def - cur > step)
{
cur += step;
}
else if (def - cur == step){
cur += step;
return step;
}
else{
cur -= step;
}
step++;
}
}

int main(){
int def;
while (1){
cin >> def;
if (def == 999)
return 0;
cout << jump(def) << endl;;
}
return 0;
}

发表于 2017-08-08 18:15:01 回复(0)
假设蚂蚁往一个方向跳不回头,设x为跳跃次数,y为单位格,则y=(1/2)x^2+(1/2)x,如果当y对应的x为整数时,跳跃次数最短。
编辑于 2017-08-08 11:12:08 回复(0)