此问题来自hackerrank,链接为:https://www.hackerrank.com/challenges/sherlock-and-squares。
下面的程序打印出给定范围内完美正方形的数字计数。但是,由于测试用例的约束为1 < testcase < 100
,并且范围内的2个整数为1 < number 1 < 10^9, 1 < number2 < 10^9
,因此出现超出时间限制的错误。
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include<math.h>
using namespace std;
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
int testcase;
cin>>testcase; //input testcase
while(testcase--)
{
int number1,number2,count=0;
cin>>number1>>number2; //input the limits
for(int i=number1;i<=number2;i++) //check for each number within the limits if it is a proper square
{
if(sqrt(i)==floor(sqrt(i)))
count++;
}
cout<<count<<endl; //print the total count of numbers that are perfect square within the limits
}
return 0;
}
有人可以告诉我如何进一步优化问题。因为我无法弄清楚时间复杂性如何进一步降低。
答案 0 :(得分:3)
我不会为你编码。但是:
不是测试每个数字,而是找到范围内的第一个完美正方形。然后,将正方形的平方根加1。这为您提供了下一个完美的广场。重复,直到达到上限。
预期的改善将在您的数字顺序附近。如果number1是1000,那么你将在每一步跳过一千个数字。这应该很容易通过。
答案 1 :(得分:2)
因为正方形的数量正是差异所在
在number1
的下一个更大的平方数的平方根和number2
下面的最大平方数的平方根之间,您可以使用类似
cout << (int) ( floor(sqrt(number2)) - ceil(sqrt(number1)) + 1)
检查number2&gt; = number1,否则交换它们。
答案 2 :(得分:0)
是复制粘贴代码吗?
您从输入流n1
和n2
获得,但在此之后您使用了未初始化的number1
和number2
。