如何减少for循环中的迭代,这需要花费很多时间来执行?

时间:2016-05-28 06:11:12

标签: java for-loop

在这里,我找到了给定范围内的完美平方数的数量。

但我正在处理'for'循环执行,这需要很长时间才能执行。

索引/键遍历两个数字,例如A到B,并在for循环中执行一些操作。

当A和B之间存在较大差异时会出现问题(例如A = 2& B = 100000)

你能否建议我如何减少或优化执行时间?

        Scanner in = new Scanner(System.in);
        int A = in.nextInt();
        int B = in.nextInt();

        int cnt = 0;
        for(int number =A ; number<= B; number++){
        int sqrt = (int) Math.sqrt(number);
              if(sqrt*sqrt == number) {
                    cnt++;
                }
        }
        System.out.println(cnt);

或者是因为Math类操作需要花费太多时间来执行?

你能否提出任何替代方法来找到给定范围之间的平方数?

提前致谢!

3 个答案:

答案 0 :(得分:3)

我找到了另一种方法来找到给定范围之间的完美平方数的计数。

这可以通过使用Math.floor和Math.ceil操作来实现。

Math.floor(Math.sqrt(B)) -  Math.ceil(Math.sqrt(A)) + 1

谢谢! :)

答案 1 :(得分:0)

我建议如下,而不是通过范围内的每个数字并确定它是否是一个完美的正方形

Find a square root of the start number and find the integer part of it.

让我们说起始数是5.所以平方根的整数部分将是2。

Now do the same for the range end number

假设结束范围是1000,所以它的平方根的整数部分将是31.现在从2 + 1迭代到31并继续打印它的正方形。这将为您提供给定范围之间的完美正方形。

答案 2 :(得分:0)

您还可以检查if(sqrt * sqrt == number)返回的double是否为整数,而不是Math.srt(number)。该算法将变为如下:

for(int number =A ; number<= B; number++){
    if((Math.sqrt(number) % 1) == 0) {
        cnt++;
    }
}

注意: Haven没有自己尝试过代码,所以可能无法正常工作。

关于如何改善表现的问题。检查数字是否完美可以通过执行每个任务来并行完成。对计数器的访问必须同步(为安全起见)。