无法弄清楚如何进一步优化代码

时间:2016-01-28 13:48:03

标签: c++

此问题来自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;
}

有人可以告诉我如何进一步优化问题。因为我无法弄清楚时间复杂性如何进一步降低。

3 个答案:

答案 0 :(得分:3)

我不会为你编码。但是:

不是测试每个数字,而是找到范围内的第一个完美正方形。然后,将正方形的平方根加1。这为您提供了下一个完美的广场。重复,直到达到上限。

预期的改善将在您的数字顺序附近。如果number1是1000,那么你将在每一步跳过一千个数字。这应该很容易通过。

答案 1 :(得分:2)

因为正方形的数量正是差异所在 在number1的下一个更大的平方数的平方根和number2下面的最大平方数的平方根之间,您可以使用类似

的内容
cout << (int) ( floor(sqrt(number2)) - ceil(sqrt(number1)) + 1)

检查number2&gt; = number1,否则交换它们。

答案 2 :(得分:0)

是复制粘贴代码吗?

您从输入流n1n2获得,但在此之后您使用了未初始化的number1number2