加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Project Euler:问题7的程序化优化?

发布时间:2020-12-15 02:05:16 所属栏目:Java 来源:网络整理
导读:所以我称自己是一个相当新手的程序员,因为我主要关注我学校的硬件而不是很多计算机科学课程. 所以我解决了Euler项目的问题7: By listing the first six prime numbers: 2,3,5,7,11,and 13,we can see that the 6th prime is 13. What is the 10001st prime
所以我称自己是一个相当新手的程序员,因为我主要关注我学校的硬件而不是很多计算机科学课程.

所以我解决了Euler项目的问题7:

By listing the first six prime numbers: 2,3,5,7,11,and 13,we can see that the 6th prime is 13.

What is the 10001st prime number?

我设法在没有问题的情况下在Java中解决了这个问题,但是当我运行我的解决方案时,它花费了8并且更改了秒数.我想知道如何从编程的角度优化这一点,而不是数学观点.

数组循环和while语句主要是耗费处理时间吗?这怎么可以优化?再一次不寻找一个奇特的数学方程式……在解决方案线程中有很多.

SPOILER我的解决方案如下所示.

public class PrimeNumberList {

private ArrayList<BigInteger> primesList = new ArrayList<BigInteger>();

public void fillList(int numberOfPrimes) {
    primesList.add(new BigInteger("2"));
    primesList.add(new BigInteger("3"));
    while (primesList.size() < numberOfPrimes){
        getNextPrime();
    }
}

private void getNextPrime() {
    BigInteger lastPrime = primesList.get(primesList.size()-1);
    BigInteger currentTestNumber = lastPrime;
    BigInteger modulusResult;
    boolean prime = false;
    while(!prime){
        prime = true;
        currentTestNumber = currentTestNumber.add(new BigInteger("2"));
        for (BigInteger bi : primesList){
            modulusResult = currentTestNumber.mod(bi);
            if (modulusResult.equals(BigInteger.ZERO)){
                prime = false;
                break;
            }
        }
        if(prime){
            primesList.add(currentTestNumber);
        }
    }
}

public BigInteger get(int primeTerm) {
    return primesList.get(primeTerm - 1);
}

}

解决方法

由于第10001个素数不是那么大,你可以先使用long而不是BigInteger. BigInteger实例是一个成熟的Java对象,在创建和操作它们时会有很多开销.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读