POJ 3175 Finding Bovine Roots (枚举)

57 篇文章 0 订阅
Finding Bovine Roots
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 4374 Accepted: 876

Description

The cows are trying to find their roots. They are not so smart as humans when they find square roots, the cows lose the integer portion of their square root calculation. Thus, instead of calculating the square root of 2 to be 1.4142135623730950488016887242096980785696, they deduce that it is 0.4142135623730950488016887242096980785696. The square root of 16 is calculated to be 0 (obviously an error).

The erroneous ciphering does, however, lead to an interesting question. Given a string of digits of length L (1 <= L <= 9), what is the smallest integer whose bovine square root decimal part begins with those digits?

By way of example, consider the string "123". The square root of 17 is approximately 4.1231056256176605498214098559740770251472 so the bovine square root is: 0.1231056256176605498214098559740770251472 whose decimal part (just after the period) starts with 123. It turns out that 17 is the smallest integer with this property.

Input

Line 1: A single integer, L

Line 2: L digits (with no spaces)

Output

Line 1: A single integer that is the smallest integer whose bovine square root starts with the supplied string

Sample Input

3
123
大体题意:
给你一个长度小于等于9的字符串,表示某个小数的后缀, 比如字符串是123,那么小数是0.123.
让你求出最小的整数x,满足sqrt(x) 去掉整数的后缀包含字符串,说的很乱,仔细读提吧,很明了!

思路:
既然X是字符串t 加上某个整数的平方(近似值),那么一定是小于x的,
拿个具体例子来说 比如说 样例  0.123,
那么必然存在一个整数k 使得(k+0.123)*(k+0.123) < x  和  (k + 0.124) * (k + 0.124) > x
所以只要枚举发现上述不等式成立即可!
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const double EPS[20] = {1,1e-1,1e-2,1e-3,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10,1e-11,1e-12};
int main(){
    int n,a;
    scanf("%d%d",&n,&a);
    double t = a;
    t*=EPS[n];
    int i;
    for (i = 1;; ++i){
        if ((ll)((t+i)*(t+i)) + 1 < ((t+i+EPS[n])*(t+i+EPS[n])))break;
    }
    printf("%I64d\n",(ll)((t+i)*(t+i)) + 1);

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值