首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java: Sieve of Eratosthenes:数组作为参数

Java: Sieve of Eratosthenes:数组作为参数
EN

Stack Overflow用户
提问于 2012-09-01 05:28:14
回答 1查看 881关注 0票数 1

我的目标是关闭或设置为false,所有不是质数的阵列点。数组是作为参数提供的。

代码语言:javascript
复制
public static boolean[] sieveOfEratosthenes(boolean [] a){

    int increment= 2;

    for(int n = 0; n < 9; n++){
        for(int i = increment; i < a.length; i += increment){
            a[i] = false;
        }
        increment += 1;
    }   
    a[2] = true;
    a[3] = true;
    a[5] = true;
    a[7] = true;
    return a;
}

代码运行得很好,我只是想知道是否有比使用更有效的方法:

代码语言:javascript
复制
a[2] = true;
a[3] = true;
a[5] = true;
a[7] = true;

将这些数组项重置为true。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-01 05:42:52

这样做的一个好方法是从迭代* 2开始循环。

代码语言:javascript
复制
int increment= 2;

for(int n = 0; n < 9; n++){
    for(int i = increment*2; i < a.length; i += increment){
        a[i] = false;
    }
    increment += 1;
}  

这样,您就可以跳过第一个。

其次,修改您的外部循环,使其忽略已经为false的值,因为它的主因子处理了它的乘积。现在你的循环看起来像这样

代码语言:javascript
复制
int increment= 2;

for(int n = 0; n < 9; n++){
    if(a[increment]) {
      for(int i = increment*2; i < a.length; i += increment){
          a[i] = false;
      }
      increment += 1;
    }
}

第三,处理数组中任意大小的数组循环以获取增量值

代码语言:javascript
复制
int count = a.length;

for(int increment = 2; increment < count; increment++){
    if(a[increment]) {
      for(int i = increment*2; i < count; i += increment){
          a[i] = false;
      }          
    }
}

这个电流回路假设1和0是质数。因此,设置a[0] = a[1] = false;以反映0和1不是质数的事实。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12222683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档