以整数形势给出了小数部分,那么就使它变成相应的整数部分为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;
}
}
}