问题 BX: 算步数

题目描述

给你坐标轴上的两个点A和B,请问从A走到B最少需要多少步?
我们对走的每一步的步长作出如下限制:
第一步和最后一步的步长必须是1,其他的任意一步的步长必须比前一步的步长小1、大1或相等。

输入

输入包含多组测试数据。每组输入两个整数A和B(0<=A<=B<2^31)。

输出

对于每组输入,输出从A走到B最少需要多少步。

样例输入 Copy

45 48
45 49
45 50

样例输出 Copy

3
3
4

代码

#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;

int main(){
	int a,b;
	while(scanf("%d %d",&a,&b)!=EOF){
		int n=abs(a-b);
		if(n==0){
			printf("0\n");
		}
		else{
			int ze=sqrt(n);
			int s=ze*ze;
			int bu=2*ze-1;
			if(n>s && n<=s+ze){
				bu++;
			}
			else if(n>s+ze){
				bu+=2;
			}
			printf("%d\n",bu);
		}
	}
	return 0;
}
#include<cstdio>
using namespace std;
int main()
{
	long int a, b;
	while (scanf("%ld%ld", &a, &b) != EOF){
        long int step = b-a;
        if(step == 0) {puts("0");continue;}
        long int n = 0;
 
        while (n*n <= step) {n++;}
        n--;
        long int left  = step - n*n;
        long int add1 = left / n;
        long int add2  = left % n;
        long int ans = 2*n-1+add1;
 
        if(add2) ans += 1;
 
        printf("%ld\n",ans);
 
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值