我遇到了一个Java程序,它找出给定的数字是否为素数。 这是代码。
class FindPrime {
public static void main(String args[]) {
int num;
boolean isPrime;
num = 14;
if (num < 2)
isPrime = false;
else
isPrime = true;
for (int i = 2; i <= num / i; i++) {
if ((num % i) == 0) {
isPrime = false;
break;
}
}
if (isPrime)
System.out.println("Prime");
else
System.out.println("Not Prime");
}
}
这里,我不确定为什么在for循环中使用条件i&lt; = num / i。有人可以解释一下吗?
答案 0 :(得分:1)
限制条件i <= num / i
是性能优化:
例如num = 11
和i = 3
,我们到目前为止检查了11是否可以除以2(否)现在正在移动到3并且我们应该检查它,答案是否定它不能除以3。现在我们要转到4,我们是否还要检查11是否可以除以它?这样的划分将产生2.75,这个值小于我们已经检查过的3。任何更高的i
都会产生更小的值,我们已经检查了所有这些值,因此没有任何意义进一步检查。我们现在知道答案了。
答案 1 :(得分:1)
i <= num/i
它就像在做i <= sqrt(num)
如果num不是素数,我们可以将其分解为num = a * b
如果num的因子大于num的平方根,则另一个必须小于num的平方根。
如果两者都大于它,则其产品将大于num。
答案 2 :(得分:0)
不要忘记, for循环 for(A;B;C)
表达式 A 在循环开始时计算一次,表达式 B 从第一个开始计算每个循环,从第二个循环开始计算表达式 C 。
因此,最好将 B 部分的偏差移至 A 部分。
i&lt; num / i 是性能优化,而且足以检查第一个Math.sqrt(num)
元素。
public static boolean isPrime(int val) {
if (val < 2)
return false;
for (int i = 2, max = (int)Math.sqrt(val); i <= max; i++)
if (val % i == 0)
return false;
return true;
}
答案 3 :(得分:0)
这是检查是否有素数的更好方法
package com.practice.competitive.maths;
import java.util.Scanner;
public class CheckPrime {
public static void main(String[] args) {
try(Scanner scanner = new Scanner(System.in)) {
int testCases = scanner.nextInt();
long number = scanner.nextLong();
String result = compute(number);
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
private static String compute(long number) {
if(number > 0 && number % 2 == 0)
return "No";
long sqrt = floorSqrt(number);
for(long i = 3; i<sqrt;i+=2) {
if(number % i == 0)
return "No";
}
return "Yes";
}
private static long floorSqrt(long number) {
if(number == 0 || number == 1)
return number;
long start = 0;
long end = number;
long answer = 0;
while (start <= end) {
long mid = (start + end)/2;
if(mid*mid == number)
return mid;
if(mid*mid < number) {
start = mid+1;
answer = mid;
}else {
end = mid-1;
}
}
return answer;
}
}
答案 4 :(得分:0)
答案 5 :(得分:0)
在程序中添加for循环是不明智的,因为它们给u带来的时间复杂度大于O(n)线性时间复杂度,但是如果声明是明智的,那么这里就是一个例子
'...'
答案 6 :(得分:-1)