在Java中查找素数

时间:2018-04-26 07:20:19

标签: java primes

我遇到了一个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。有人可以解释一下吗?

7 个答案:

答案 0 :(得分:1)

限制条件i <= num / i是性能优化:

例如num = 11i = 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)

以下解决方案使用Sieve of Sundaram打印出所有素数,直到用户提供的素数:

请注意,对于大的输入,您可能会遇到OutOfMemoryError。

template < ... >

答案 5 :(得分:0)

在程序中添加for循环是不明智的,因为它们给u带来的时间复杂度大于O(n)线性时间复杂度,但是如果声明是明智的,那么这里就是一个例子

'...'

答案 6 :(得分:-1)

是的,是的。 始终评估for循环的中间部分,并且仅当评估给出真值时循环内容才会运行。 在你的情况下,循环将在第一个循环停止,因为14/2的模块是0,因此它将运行if body,它将boolean设置为false并退出循环。