POJ 3175 Finding Bovine Roots

本文探讨了一种特殊的平方根计算方法,即“Bovine平方根”。目标是在给定长度L的数字串的情况下,找到最小的整数,使得该整数的Bovine平方根的小数部分开始匹配给定的数字串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Finding Bovine Roots
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 4546 Accepted: 931

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

Sample Output

17

这道题目是给定一个指定数位L的整数N。寻找一个最小的整数,对他求平方根,令小数点后的L位与N相等。

第一次做的时候暴力列举的时候TL,显然方法不对。采用枚举的方法,直接将输入的整数化作小数,每一次加1,递增。看它的平方取整之后与它+(1e+L)平方取整的大小,以此作为+1的结束条件。类似于sqrt(16) 与sqrt(17)  两者的平方根取整都为4,但是他们本身的值不同。

#include<cstdio>
#include<math.h>
#include <iostream>
#define eps 1e-8
using namespace std;
typedef long long ll;
double a[11]={1,1e-1,1e-2,1e-3,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10};

int main(){
    int n;
    int m;
    double p,q,x,y;
    while(scanf("%d",&n)!=EOF){
        scanf("%d",&m);
        p=m*a[n];  q=(m+1)*a[n];
        x=y=0;
        while(x==y){
            p+=1; q+=1;
            x=(ll)(p*p);  y=(ll)(q*q-eps);//使用long long 取整,防止溢出
        }
        printf("%.f\n",(y));
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值