有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中寻找素数

我遇到了一个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");
    }
}

在这里,我不知道为什么我<;=num/i用于for循环。谁能给我解释一下吗


共 (6) 个答案

  1. # 1 楼答案

    i <= num/i就像做i <= sqrt(num)
    如果num不是素数,我们可以把它分解成num = a * b
    如果num的一个因子大于num的平方根,那么另一个必须小于num的平方根。
    如果两者都大于它,那么它的乘积将大于num

  2. # 2 楼答案

    在程序中添加for循环是不明智的,因为它们会给u带来更大的时间复杂度O(n)线性时间复杂度,但是if语句在这里是一个例子

    // code contributed by akoyama koke
    
    public class prime
    {
        public static void main(String[] args) 
        {
            int []arry={1,23,71,3,4,5,6,8,21};
            int n=arry[8];
            if(n%2==0)
            {
                System.out.print("number is even:"+" "+n);
            }
            else if(n%2!=0)
            {
                if(n%3!=0 && n%5!=0 && n%7!=0)
                {
                     System.out.print("number is prime:"+" "+n);
                }
                else
                {
                    System.out.print("number is odd and not prime:"+"  "+n);
                }
            }
            else
             System.out.println("number either decimal or a negative not catared for:"+" "+n);
        }
    }    
  3. # 3 楼答案

    这是检查素数与否的更好方法

    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. # 4 楼答案

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

    请注意,对于较大的输入,可能会出现OutOfMemory错误

    public static void isPrime(int num) {
        int k = (num - 2) / 2;
        int[] a = new int[k + 1];
        for (int i = 1; i < k + 1; i++) {
            int j = i;
            while ((i + j + 2 * i * j) <= k) {
                a[i + j + 2 * i * j] = 1;
                j += 1;
            }
        }
        if (num > 2) {
            System.out.println(2);
        }
    
        for (int l = 1; l < k + 1; l++) {
            if (a[l] == 0) {
                System.out.println((2 * l + 1));
            }
        }
    }
    
  5. # 5 楼答案

    限制条件是性能优化:

    例如num = 11i = 3,到目前为止,我们已经检查了11是否可以被2除(否),现在正在移动到3,我们应该检查它,答案是不,它不能被3除。现在我们移动到4,我们是否应该检查11是否可以除以它?这样的除法将产生2.75,这个值小于我们已经检查过的3。任何更高的i将产生更小的值,我们已经检查过所有这些值,因此进一步检查没有意义。我们现在知道答案了

  6. # 6 楼答案

    不要忘记,对于类循环for(A;B;C)表达式A在循环开始时计算一次,表达式B从第一个循环开始计算每个循环,表达式C从第二个循环开始计算

    因此,最好将偏差从B部分移动到A部分

    我<;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;
    }