在查找c ++范围内的完美正方形时由于超时错误而终止

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在查找c ++范围内的完美正方形时由于超时错误而终止相关的知识,希望对你有一定的参考价值。

我正在尝试解决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<<"
";
    }
}
答案

您的速度问题是可见的,超过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);
}

以上是关于在查找c ++范围内的完美正方形时由于超时错误而终止的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 g++ 内存范围重叠?

运行时错误:424:当我尝试达到范围并使用范围数据时所需的对象

WKWebView:当多个元素在同一文档中使用该大小时,某些大小范围内的文本以错误的大小呈现

无效的过程调用或参数

数组访问越界

数组访问越界