java 判断素数_每日一课 | 在Java中确定素数

e3f53e152472e5fac8bf09674cc004c4.gif

在数学和安全性中,一个非常重要的问题是判断数字是否为质数。在加密密码时,这非常有用。在本教程中,您将学习在简单情况下如何查找数字是否为质数。

琐事

我们了解到,如果数字唯一的除数是1及其本身,那么它们就是质数。琐碎地,我们可以检查从1到其自身(不包括在内)的每个整数,并测试它是否均分。

例如,可能会想运行此算法: 

//checks whether an int is prime or not.boolean isPrime(int n) {for(int i=2;i        if(n%i==0)return false;
    }return true;
}

乍一看,这似乎还不错,但是我们可以使其更快-更快。考虑一下,如果2除以某个整数n,那么(n / 2)也将n除。这表明我们不必尝试2到n之间的所有整数。现在我们可以修改算法: 

//checks whether an int is prime or not.boolean isPrime(int n) {for(int i=2;2*i        if(n%i==0)return false;
    }return true;
}

通过一些更有效的编码,我们注意到您实际上只需要向上求n的平方根,因为如果您列出一个数字的所有因子,则平方根将始终位于中间(如果碰巧不是整数,我们还是可以的,只是可能过于近似,但我们的代码仍然可以使用)。

最后,我们知道2是“奇数”素数-它恰好是唯一的偶数素数。因此,我们只需要单独检查2,然后遍历奇数直到n的平方根即可。最后,我们的代码类似于: 

//checks whether an int is prime or not.boolean isPrime(int n) {//check if n is a multiple of 2if (n%2==0) return false;//if not, then just check the oddsfor(int i=3;i*i<=n;i+=2) {if(n%i==0)return false;
    }return true;
}

如您所见,我们已经从检查每个整数(最多检查n个以发现一个数为质数)到检查整数的一半直至平方根(实际上是奇数)。这是一个巨大的改进,尤其是考虑到数量很大时。

重复次数

假设您编写了一个程序,要求您检查是否有很多素数;不只是一次 即使我们上面的程序针对该算法进行了高度优化,也存在另一种特别适合这种情况的方式:Prime Sieve。

这是基本思想:

  1. 假设每个大于或等于2的整数均为质数。

  2. 从列表的开头开始,如果数字是质数,请从列表中减去该数字的每一个倍数。他们不是素数。

  3. 转到下一个数字(如果已被划掉),请跳过它-它不是素数。如果未加倍,则必须是质数,加倍。

  4. 重复

让我们看看这意味着什么。考虑以下列表:

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...

2是质数...相乘是倍数。现在,我们的列表如下所示:2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18岁 19 20 …

您会看到为什么2是唯一的质数。现在用3进行处理,我们将6(已被删除),9、12(已被删除),15等删除。最终,您的列表将如下所示:2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18岁 19 20 …

我们的素数就是剩下的素数:(2,3,5,7,11,13,17,19,23,29,…)。在代码中,您可能希望以数组的形式跟踪此列表。这意味着您将要遍历n个数字来设置此“筛子”,但在重复调用该函数时会加以弥补,因为无论数字是否为质数,该函数都会返回一个瞬时值。这就是它的样子。当然,您可以根据自己的需要进行编辑: 

import java.util.Arrays;//global array just to keep track of it in this example,//but you can easily do this within another function.// will contain true or false values for the first 10,000 integersboolean[] primes=new boolean[10000];//set up the primesievepublic void fillSieve() {
    Arrays.fill(primes,true); // assume all integers are prime.
    primes[0]=primes[1]=false; // we know 0 and 1 are not prime.for (int i=2;i        //if the number is prime,//then go through all its multiples and make their values false.if(primes[i]) {for (int j=2;i*j                primes[i*j]=false;
            }
        }
    }
}public boolean isPrime(int n) {return primes[n]; //simple, huh?
}

翻译自: https://mkyong.com/java/how-to-determine-a-prime-number-in-java/

推荐阅读--

每日一课 | Java 中如何将 ArrayList 与 HashSet 互相转换?

每日一课 | JavaScript基础

每日一课 | JavaScript的事件

每日一课 | JavaScript的内置对象

ef82af6b-932b-eb11-8da9-e4434bdf6706.svg

球分享

f182af6b-932b-eb11-8da9-e4434bdf6706.svg

球点赞

5e99bc4ef4b269891ad1b0d68ea8d6f8.gif

球在看

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值