关于JAVA,布尔型数组求素数的方法

TangLMalan 2015-04-24 02:41:47
问题有:1.如果下标为K的数组为true。表示整数k是质数,否则,k不是质数。因此,初始化isPrime[ i ] 为false。isPrime[ 2 ] 为true。 数组其他元素为true。
2.遍历isPrime数组,下标从1开始,到range的开方结束,根据“质数的倍数不是质数”的规则,改变isPrime数组的值,遍历结束后,isPrime数组中下标为非质数的整数的元素的值肯定为false。下标为质数的整数的整数的值还是true。
这是为什么呢?假如range = 200 ; 那么从1,2,3,4……200;在数组中,[0]是1,[1]是2.[3]是4.【3】中3,是质数,但是它代表的整数4就不是质数啊?
import java.util.*;
public class Shuzu{
public void showPrimeNumber(int range){
boolean[] primes = this.sieve(range);
int number = 0 ;
if(primes != null){
int size = primes.length;
System.out.println("范围在"+range+"内的质数个数有:");
for(int i = 1 ; i< size ; i++){
if(primes[i]){
System.out.print(i + " ");

if(++number %10 ==0){
System.out.println();
}
}
}
System.out.println();
}
System.out.println("一共有"+number+"个");
}
private boolean[] sieve(int range){
if(range <= 0 ){
System.out.println("求质数的范围range必须大于0!");
return null;
}
boolean[] isPrime = new boolean[range + 1];
isPrime[1] = false ;
Arrays.fill(isPrime, 2,range+1,true);
int n = (int)Math.sqrt(range);
for(int i = 1 ; i <= n ; i++){
if(isPrime[i]){
for(int j = 2 * i ;j <= range ; j+=i){
isPrime[j] = false;

}
}
}
return isPrime;
}
public static void main(String args[]){
int range = 0 ;
Shuzu test = new Shuzu();
test.showPrimeNumber(range);

}
}
...全文
450 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
余子秋 2016-09-27
  • 打赏
  • 举报
回复
isPrime[1] = false ; Arrays.fill(isPrime, 2,range+1,true); 这两句是什么意思呢
youzi05 2015-04-25
  • 打赏
  • 举报
回复

for(int i = 1 ; i <= n ; i++){
    if(isPrime[i]){
        for(int j = 2 * i ;j <= range ; j+=i){
            isPrime[j] = false;
        }
    }
}
这个就很好解释了,如果 i 是素数, 那么从 2i 开始,把所有i的倍数改为非素数。 如果 i 不是素数,那就以为这 i 是某个素数的倍数,所以 2i 也是,3i也是...所以,没有必要再修改了
youzi05 2015-04-25
  • 打赏
  • 举报
回复
int n = (int)Math.sqrt(range);
获得最大值的平方根,循环只需要到 n 就行了, 原因如下: 假设 range = n1 * n2 那么 n1 和 n2 中必有一个 小于等于 n的。 也就是说,如果range可以分解,那么必有一个小于 sqrt(n) 的因子
youzi05 2015-04-25
  • 打赏
  • 举报
回复

boolean[] isPrime = new boolean[range + 1];
isPrime[1] = false ;
Arrays.fill(isPrime, 2,range+1,true);
这几行看的懂吧,就是分配长度为的 总数+1 boolean数组。注意多了一个,所以数组的第一个,也就是下标为0的元素没有用,现在计算机内存足够,所以经常为了程序更符合人们的思维,经常多分配一个元素,然后第一个不用
TangLMalan 2015-04-25
  • 打赏
  • 举报
回复
我看不懂这个程序
highnewrain 2015-04-24
  • 打赏
  • 举报
回复

你原来代码运行结果没问题啊!

58,442

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧