n,x的范围?以及时间要求?
不管了先上一个最初始的代码
#include <iostream> using namespace std; int x; double n; int main() { scanf("%lf",&n); int a=(int) n; int ans=0; for(int i=a;i>=0;i--) { if(i*i<=a) { ans=i; break; } } printf("%d\n",ans); return 0; }
------------------------------------更新--------------------------------------------
更新说明,使用二分法代替sqrt
int范围内最多就是一个亿,二分之后循环的测试最多是10000
二分加循环,计算机用几十毫秒就可以轻松解决。
#include <iostream> using namespace std; long long int x; double n; long long int a; long long int fun(long long int l,long long int r) { if(l>r) return l; long long int y=(l+r)/2; if(y*y<a) return fun(y+1,r); else if(y*y>a) return fun(l,y-1); else return y; } int main() { scanf("%lf",&n); a=(long long int) n; long long int ans=0; long long int b=fun(1,a); for(long long int i=b;i>=0;i--) { if(i*i<=a) { ans=i; break; } } printf("%lld\n",ans); return 0; }
x 很明显是int类型的,n是double的 范围就是这两个范围。时间越快越好,不限