由于在c ++范围内查找完美平方时发生超时错误而终止

时间:2018-07-24 13:19:51

标签: c++ c++11

我正在尝试解决Hackerrank (link)中的Sherlock和Square问题,以便在一系列数据中找到理想的平方。 4个测试用例通过,但是我收到大量超时错误。请提出建议以改善其性能

我的代码如下:

#include<iostream>
#include<cmath>

using namespace std;

int squares(int a, int b) {
    long double i;
    long long int count=0;
    for(i=a;i<=b;i++)
    {
        long double b = sqrt(i);
        if(fmod(b,1)==0.000000)
        {
            count++;
        }
    }
    return count;
}

int main()
{
    int q,i,a,b;
    cin>>q;
    for(i=0;i<q;i++)
    {
        cin>>a>>b;
        int result = squares(a, b);
        cout<<result<<"\n";
    }
}

2 个答案:

答案 0 :(得分:0)

对于大型输入,例如

,您的速度问题很明显,运行了16秒以上
1
1 1000000000

所以简单的解决方案是摆脱squares()中的循环,并对其进行计算 分析性地:

int squares(int a, int b) 
{
    auto sqrt_from = a < 0 ? 0 : static_cast<int>(std::ceil(std::sqrt(a)));
    auto sqrt_to = b < 0 ? 0 : static_cast<int>(std::floor(std::sqrt(b)));
    return std::max(sqrt_to - sqrt_from + 1, 0);
}

当然,如果您在输入中阻止负值,那么一切都可以 造出unsigned,您将获得更多收益:

unsigned squares(unsigned a, unsigned b) 
{
    auto sqrt_from = static_cast<unsigned >(std::ceil(std::sqrt(a)));
    auto sqrt_to =   static_cast<unsigned >(std::floor(std::sqrt(b)));
    return std::max(sqrt_to - sqrt_from + 1, 0);
}

答案 1 :(得分:0)

我遇到了同样的问题,然后我意识到有一个捷径。一旦找到第一个完美的正方形,例如。数字4 = 2 * 2,则4之后的下一个完美平方将是9 = 3 * 3,依此类推。这是我的Java代码。

    int count = 0;

    for (int i = a; i <= b; i++) {
        int sq = (int) Math.sqrt(i);
        if (i == sq * sq) {
            count++;
            i = (sq + 1) * (sq + 1) - 1;
        }
    }

    return count;