在找工作的时候,笔试中经常能碰到求素数的编程题,或者是求多少以内的素数,或者是求多少以内的素数和。
这两天,我也对这个问题有了点兴趣,上网找了一些资料。整理之后,得到以下两个方法,个人觉得第二种算是很优化的了。
第一种方法:
for (int i = 1; i < mList.size(); i++) {
int a = mList.get(i);
for (int j = 0; j < i; j++) {
int b = mList.get(j);
if (a % b == 0) {
mList.remove(i);
i--;
break;
}
}
}
这种方法是先把数字都存到一个集合当中,然后过滤掉2的倍数以及3的倍数,然后遍历下去,当遍历到一个数的时候,看看集合当中位置在它之前的数,有没有能整除的,如果有的话,在集合中删除掉这个数,以此类推。
这种方法基本就是根据质数的概念来计算的,在效率上要低一些。
第二种方法
这种方法类似的在网上有很多,关键点就在于求一个数是否是质数,就先求出它的平方根,之后判断是否能被平方根以内的除1以外的某个自然数整除,如果有能整除的,那么这个数即为合数,没有即为质数。
@Override
public void makePrimeList()
{
for (int i = 0; i < mList.size(); i++) {
Integer dividend = mList.get(i);
Integer divisor = 2;
int sqrt = (int)Math.sqrt(dividend);
for (int j = 0; j <= sqrt && divisor <= sqrt; j++) {
divisor = mList.get(j);
if (dividend % divisor == 0) {
mList.remove(dividend);
i --;
break;
}
}
}
}
说一下平方根强转的问题,其实不强转当然也可以,不过我测试了几次,感觉强转的话,可能会稍微快点。
在我写的这个算法当中,加入了分解质因数的概念,即只判断是否能够被平方根之前的某个质数整除,这样的话,效率提高了很多。
我粗略的统计了下,求十五万以内的质数,用第一种方法,在我的电脑上用时差不多为27秒左右的时间,而用第二种方法用时为16秒左右的时间,差不多快了十秒。
修改1:
刚刚在CSDN上看到了这个算法,同样算15万以内的质数的个数,测试了几次。平均用时30毫秒左右,再看看自己上面的代码,真是太惭愧了。
@Override
public void makePrimeList()
{
int n = mNumber;
BitSet b = new BitSet(n + 1);
int count = 0;
int i;
for (i = 2; i <= n; i++)
b.set(i);
i = 2;
while (i * i <= n) {
if (b.get(i)) {
count++;
int k = 2 * i;
while (k <= n) {
b.clear(k);
k += i;
}
}
i++;
}
mList.clear();
i = 2;
while (i <= n) {
if (b.get(i))
mList.add(i);
i++;
}
}
分享到:
相关推荐
### Java求素数的经典算法 #### 一、引言 素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的数。求解素数是计算机科学中的一个经典问题,特别是在密码学等领域有着重要的应用价值。Java作为一门流行...
java 求质数实例程序 求质数 源代码 简单易懂
java,很简单的算法求素数
"Java求质数的几种常用算法分析" 本文主要介绍了Java中求质数的几种常用算法,并结合实例形式分析了三种比较常见的求质数算法原理及相关实现技巧。 一、根据质数的定义求质数 质数的定义是:只能被1或者自身整除...
这是一个用java编写的控制台程序,可以求一个数是不是质数,并且把这个数按递减顺序求,一直求到1,一次性的显示判断
java的10000以内的数的素数的求法,算法简单易懂
利用java编程实现素数的求解,比较方便,代码较小,可以用于其他地方。
Java 大素数 判断 低时间复杂度.
"java 素数_求素数"这部分描述了压缩文件的核心内容,即用Java语言实现的一个程序,用于找出1到50之间的所有素数。 素数是大于1且只能被1和其自身整除的自然数,例如2、3、5、7、11等。在计算机科学中,尤其是算法...
在Java语言中实现求素数的原根,我们需要以下步骤: 1. **素数判断**:首先需要一个函数来判断输入的数是否为素数。可以采用试除法,从2到这个数的平方根,如果发现有任何能整除的数,那么这个数不是素数。如果没有...
【Java】求1-100范围内的素数递归方法代码例子。分享,感谢。
求1到100的素数,不过这个算法可能不是很好,另外,还要有,5个换行输出
69.java找素数.zip69.java找素数.zip69.java找素数.zip69.java找素数.zip69.java找素数.zip69.java找素数.zip69.java找素数.zip69.java找素数.zip69.java找素数.zip69.java找素数.zip69.java找素数.zip69.java找素数...
总之,Java中的筛选法求素数是一种实用的算法,它结合了数学原理和编程技巧,能够有效地找出一定范围内的所有素数。通过理解并实践这段代码,开发者可以深入理解素数筛选法的实现细节,并将其应用到更广泛的编程场景...
Java 求指定范围内素数的个数,接受用户从键盘输入所求范围,计算出该范围内素数的个数。
判断一个数是否为质数的静态函数 自己所写的最优算法
本示例中,我们探讨的主题是如何使用Java编程语言来找出100之内的所有素数。素数是自然数中的一个特殊类别,它们只能被1和自身整除,没有其他正因数。在数学上,2是最小的素数,而1则不被认为是素数。 在Java中,...
在编程领域,尤其是在Java语言中,计算特定范围内素数之和是一个常见的算法问题。这个问题的目的是找到第n个到第m个素数(包括n和m)的总和,其中0 。在这个过程中,我们需要掌握以下几个关键知识点: 1. **素数...
关于Java中素数的概念,及Java代码的写法,写了几种方法
这个压缩包文件“素数”可能包含了一个或多个Java源代码文件,用于解决Java第二版教材中的素数相关习题。以下将详细介绍Java编程中如何实现素数检测,并扩展到相关的数学和算法知识。 1. **素数判断算法**: - 最...