欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

非常规的两种素数算法

程序员文章站 2022-05-02 08:19:22
...

最近在看Java,看到有个教授讲得素数算法很有意思(具体可以去看我后面的参考链接),他讲了两种算法都很有意思,和一般的素数算法不一样.

方法一: 素数相爱相杀法(我瞎几把起的名字)

talk is cheap,show me the code. (不逼逼,先上代码)
非常规的两种素数算法
(插一句…虽然笑容有点…,但这位是真大佬…插个图,表达下崇拜之情吧…)

package hello;

import java.util.Scanner;

public class Hello {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner in = new Scanner(System.in);
		int [] primes = new int[50];
		primes[0] = 2;
		int cnt =1;
		
		MAIN_LOOP:
		for ( int x = 3; cnt <50; x++)
		{
			 for (int i=0; i<cnt;i++)
			 {
				  if ( x % primes[i] == 0)
				  {
					  continue MAIN_LOOP;
				  }
			 }
			 primes[cnt++] = x;
		}


		for (int k : primes)
		{
			System.out.println(k +" ");
		}
         


	}							

}

非常规的两种素数算法
然后我们用编译器跑下这个代码,生成以下素数:

非常规的两种素数算法
然后看下已知的素数表
非常规的两种素数算法

没毛病,都正确.

思考:

  1. 当时我看到这里一脸懵逼,啥米,不能整除已知前面素数的数咋就认定一定数素数呢(有点绕…
    聪明的你一定能看懂代码的…我就懒得解释了.)
  2. 利用已知的素数来找后面的素数,其核心的思想是一个数能否被已知且小于其本身的素数整除;
  3. 利用一个性质:一个合数(非质数)都能分解为若干个比它小的质数的乘积。

非常规的两种素数算法
(不知道咋了,这个老是*号乱码,只能发截图了…)
如果我们把以前的质数保存起来,只需判断是否能被比它小的质数整除即可,

方法二: 排除法(巧妙利用素数的定义)

package hello;

import java.util.Scanner;

public class Hello {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner in = new Scanner(System.in);
		boolean [] isPrime = new boolean[100];
		for  ( int i=0; i<isPrime.length;i++)
		{
			isPrime[i] = true;
		}
		
		for (int i=2; i<isPrime.length;i++)
		{
			   if (isPrime[i])
			   {
				      for (int k =2; i*k<isPrime.length;k++)
				      {
				    	  isPrime[i*k] = false;
				      }
			   }
		}
		
	    for (int i=2; i<isPrime.length;i++)
	    {
	    	   if (isPrime[i])
	    	   {
	    		   System.out.println(i+" ")
	    	   }
	    }


	}							

}

思考:

这个原理很简单,若a是素数,那么a*i(i>=2 ,i为整数)必然不是素数.

OVER!

参考链接:

  1. https://www.icourse163.org/course/ZJU-1001541001

  2. https://www.cnblogs.com/TenosDoIt/p/3398112.html

  3. https://blog.csdn.net/dlengong/article/details/7425673

相关标签: 算法 Java java