非常规的两种素数算法
程序员文章站
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 +" ");
}
}
}
然后我们用编译器跑下这个代码,生成以下素数:
然后看下已知的素数表
没毛病,都正确.
思考:
- 当时我看到这里一脸懵逼,啥米,不能整除已知前面素数的数咋就认定一定数素数呢(有点绕…
聪明的你一定能看懂代码的…我就懒得解释了.) - 利用已知的素数来找后面的素数,其核心的思想是一个数能否被已知且小于其本身的素数整除;
- 利用一个性质:一个合数(非质数)都能分解为若干个比它小的质数的乘积。
(不知道咋了,这个老是*号乱码,只能发截图了…)
如果我们把以前的质数保存起来,只需判断是否能被比它小的质数整除即可,
方法二: 排除法(巧妙利用素数的定义)
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!
参考链接:
-
https://www.icourse163.org/course/ZJU-1001541001
-
https://www.cnblogs.com/TenosDoIt/p/3398112.html
-
https://blog.csdn.net/dlengong/article/details/7425673
上一篇: Spring Boot属性配置和使用
下一篇: 北漂 8 年的程序员,疫情下撤退回老家