非常规的两种素数算法

最近在看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

发布了6 篇原创文章 · 获赞 2 · 访问量 821

猜你喜欢

转载自blog.csdn.net/Codeliang666/article/details/103748104