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