在这里,我找到了给定范围内的完美平方数的数量。
但我正在处理'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类操作需要花费太多时间来执行?
你能否提出任何替代方法来找到给定范围之间的平方数?
提前致谢!
答案 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没有自己尝试过代码,所以可能无法正常工作。
关于如何改善表现的问题。检查数字是否完美可以通过执行每个任务来并行完成。对计数器的访问必须同步(为安全起见)。