5
\$\begingroup\$

The problem is to find out the squares between two numbers, inclusive of the numbers. The two numbers are in the range between 1 and 109.

long numberOne = in.nextLong();
            long numberTwo = in.nextLong();
            int count=0;
            for(long j=numberOne;j<=numberTwo;j++){
                double numSquareRoot=Math.sqrt(j);
                double numFloor=Math.floor(numSquareRoot);
                if(numSquareRoot == numFloor) count++;
            }

What changes can be made to work efficiently on large numbers?

\$\endgroup\$
12
\$\begingroup\$

Can be done in \$O(1)\$ time

The count should be:

\$\lfloor{\sqrt n}\rfloor -\lceil{\sqrt m}\rceil + 1\$

or in terms of your program:

return Math.floor(Math.sqrt(numberTwo)) - Math.ceil(Math.sqrt(numberOne)) + 1;
\$\endgroup\$
  • \$\begingroup\$ I'm not math background. Mind to explain as simple as you could how you get this? And whats that O(1) time? What topic/subject is that? \$\endgroup\$ – Coisox Jun 3 '16 at 0:18

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.