您的位置:首页 > 编程语言 > Java开发

Java版本 质数(也叫素数)算法

2009-11-19 17:20 309 查看
原文的传送门http://bbs.51js.com/viewthread.php?tid=85219

看了原文的算法,我转成java版本了

int MaxNum = 100000;                //  查找 2到MaxNum 这范围内的素数   ( MaxNum 要>= 2 ).

int i, j;                          // 计数器.

int PrimeTemp [] = new int [MaxNum];                // 在这个数组做记号, 做了记号的, 全不是素数.

ArrayList<Integer> result = new ArrayList <Integer>();  // 贮存素数的 数组.   因为 MaxNum >= 2, 所以第一个数组元素的值为 2 .

result.add(2);

double oNum = Math.ceil( Math.sqrt( MaxNum ) );   // 为什么用 开方?  看到下面2个 for 没.

// 把不是素数的做 "记号".

//  +=2 我们整个程序都不用双数, 全用单数, 这样就快2倍了.
for(i = 3; i < oNum; i += 2) {

// 初始化 PrimeTemp 的数组, 数组里面当然什么都没有.
if(PrimeTemp[i] == 0 ) {

// i 的 j 倍一定不是素数, 但我们要 i*j 来看看是否超过了 MaxNum
for( j = i; i * j <= MaxNum; j += 2) {

PrimeTemp[ i*j ] = -1; // 初始化 PrimeTemp 里的元素, 现在来帮它们做一个 "记号". 因为这个元素"不是"素数.
}
}
}

// 输出素数了.

// +=2 ,不要忘记, 我们不用双数的.
for(i = 3; i <= MaxNum; i += 2) {

// 如果是 true , 这就表明 这个没有被做 "记号" , 所以它是 素数.
if(PrimeTemp[i] == 0 ) {

result.add(i);
}

}

for (int k = 0; k < result.size(); k++) {

System.out.println(result.get(k));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: