[OJ] 非常规的两种素数算法

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

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

不逼逼,直接上代码
在这里插入图片描述

(插个图,表达下崇拜之情吧…)

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值