为什么我的Serat of Eratosthenes算法实现会进入无限循环?

时间:2016-12-06 10:09:44

标签: algorithm loops sieve-of-eratosthenes sieve

我正在实施Sieve的算法,用于查找最多为n的素数。我无法找出为什么它会进入无限循环。

我在这里给出了代码段。请帮忙。

for(int j=2;j<=Math.sqrt(n);j++){
  if(a[j]==true){
     int x=0;
     for(int p=(j*j+x*j); p<=n;x++){
        a[p]=true;
     }
  }
}   

2 个答案:

答案 0 :(得分:5)

你的内循环正在检查p但从不改变它

答案 1 :(得分:1)

一些优化建议:

// When j is 2, the bitwise (2 & 1) will be 0, so the cycle increments by 1
// When j is odd (from 3 and above), the cycle goes in steps of 2 
// (thus exploring only odd numbers)
// As a result, this cycle is twice as faster than the one progressing
// in increments of 1 
// See here --------------------V
for(int j=2;j<=Math.sqrt(n);j+=(j & 1 ? 2 : 1)) {
  if(a[j]==true){
     // int x=0; // what for?
     // a sum is cheaper than a multiplication
     // Here --V and here --V
     for(int p=j*j; p<=n;p+=j){
        a[p]=true;
     }
  }
}