📌  相关文章
📜  Java程序,可有效打印给定数字的所有素数

📅  最后修改于: 2021-05-04 19:46:49             🧑  作者: Mango

给定数字n,编写一个有效函数以打印n的所有素数。例如,如果输入数字为12,则输出应为“ 2 2 3”。如果输入数字为315,则输出应为“ 3 3 5 7”。
以下是查找所有主要因素的步骤。
1)当n被2整除时,打印2并将n除以2。
2)步骤1之后,n必须为奇数。现在从i = 3到n的平方根开始循环。当我将n除以n时,打印i并将n除以i,再将i除以2并继续。
3)如果n是质数且大于2,那么经过以上两个步骤,n不会变为1。因此,如果大于2,则打印n。

// Program to print all prime factors
import java.io.*;
import java.lang.Math;
  
class GFG {
    // A function to print all prime factors
    // of a given number n
    public static void primeFactors(int n)
    {
        // Print the number of 2s that divide n
        while (n % 2 == 0) {
            System.out.print(2 + " ");
            n /= 2;
        }
  
        // n must be odd at this point.  So we can
        // skip one element (Note i = i +2)
        for (int i = 3; i <= Math.sqrt(n); i += 2) {
            // While i divides n, print i and divide n
            while (n % i == 0) {
                System.out.print(i + " ");
                n /= i;
            }
        }
  
        // This condition is to handle the case whien
        // n is a prime number greater than 2
        if (n > 2)
            System.out.print(n);
    }
  
    public static void main(String[] args)
    {
        int n = 315;
        primeFactors(n);
    }
}
输出:
3 3 5 7

这是如何运作的?
步骤1和2负责合成数字,而步骤3负责质数。为了证明完整的算法有效,我们需要证明步骤1和2实际上处理了复合数。显然,第1步要处理偶数。在第1步之后,所有剩余质数必须为奇数(两个质数之差必须至少为2),这解释了为什么我要加2。
现在最主要的是,循环一直运行到n的平方根为止。为了证明这种优化有效,让我们考虑以下合成数字的属性。
每个复合数至少具有一个小于或等于其平方根的素数。
可以使用计数器语句证明此属性。令a和b为n的两个因数,使得a * b = n。如果两者均大于√n,则ab>√n,*√n,这与表达式“ a * b = n”相矛盾。

在上述算法的第2步中,我们运行一个循环并在循环中进行后续操作
a)找到最小素数因子i(必须小于√n,)
b)通过将n重复除以i,从n中删除所有出现的i。
c)重复步骤a和b,除以n,i = i +2。重复步骤a和b,直到n变为1或质数。

请参阅有关高效程序的完整文章,以打印给定数字的所有主要因素,以获取更多详细信息!