POJ 3175 Finding Bovine Roots

通过构造两个具有微小差异的小数并逐步增加它们的整数部分,直至两者的平方向下取整后的结果出现差异,以此来找出特定条件下最小的整数。

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

以整数形势给出了小数部分,那么就使它变成相应的整数部分为0的小数,再构造一个和它略有误差的小数

使两者同时平方然后向下取整,如果取整结果相同,那么就两者整数部分同时增加1。

暴力循环,直到两者误差够大,就出现了那个最小整数。

但是数据有0.99 0.998 这种类似情况,所以需要处理一下。

#include<stdio.h>
#include<iostream>
#include<math.h>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<ctype.h>
#include<algorithm>
#include<deque>
#include<functional>
#include<iterator>
#include<vector>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<sstream>
#define CPY(A, B) memcpy(A, B, sizeof(A))
typedef long long LL;
typedef unsigned long long uLL;
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const LL INFF = 0x3f3f3f3f3f3f3f3fLL;
const double EPS = 1e-9;
const double OO = 1e20;
const double PI = acos (-1.0);
int dx[]= {0,1,1,1,0,-1,-1,-1};
int dy[]= {1,1,0,-1,-1,-1,0,1};
int gcd (const LL &a, const LL &b) {return b==0?a:gcd (b,a%b);}
using namespace std;
double decimal[11]= {1,1e-1,1e-2,1e-3,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10};//L最大是9
int main() {
    int L; scanf ("%d",&L);
    int num; scanf ("%d",&num);
    double t1,t2,t,tt;
    t1=num*decimal[L];//变成小数
    t2=t1+decimal[L];//构造有误差小数
    tt=t=0;
    while (t==tt) {
        ++t1; ++t2;
        t=floor (t1*t1);
        //tt=floor (t2*t2);//be careful:0.99
        tt=floor (t2*t2-EPS);//处理误差
        ///cout<<setprecision (10) <<fixed<<t1*t1<<" "<<t2*t2<<endl;
    }
    printf ("%.f\n",floor (tt) );
    return 0;
}

后期补充:

学长ZJ版:

double ep[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 L; scanf ("%d",&L);
    int num; scanf ("%d",&num);
    double p=num*ep[L];
    for (int i=1;; ++i) {
        double now= (p+i+ep[L]) * (p+i+ep[L]);
        double s= (LL) ( (p+i) * (p+i) )+1;
        if (now>s) {
            printf ("%.f\n",s);
            return 0;
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值