首页新闻找找看学习计划

问一个算法问题

0
悬赏园豆:50 [已解决问题] 解决于 2018-03-30 09:35

语言不限,代码执行越快越好,求x*x最近接近n的x(n是double,x可以是正整数/负整数或0,不能用Sqrt)

Bluto的主页 Bluto | 菜鸟二级 | 园豆:317
提问于:2018-03-29 17:57
< >
分享
最佳答案
0

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;
}

 

收获园豆:50
Shendu.CC | 小虾三级 |园豆:1914 | 2018-03-29 18:01

x 很明显是int类型的,n是double的 范围就是这两个范围。时间越快越好,不限

Bluto | 园豆:317 (菜鸟二级) | 2018-03-29 18:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册