A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不抛弃不放弃 中级黑马   /  2013-11-27 18:37  /  1640 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 不抛弃不放弃 于 2013-11-27 22:52 编辑

/*列出素数
* 在所有整数中,除啦1之外的所有数中,只能整除1和他本身的数,这种数叫质数或素数
*
*/
public class ForCycle_06 {
public static void main(String[] args){
  int num=100;  //声明求质数的范围
  System.out.println("范围在"+num+"内的质数有:");
  showPrimeNumber(num);  //调用方法显示质数
}
private static boolean[] primeNumber(int num){  //求质数
  if(num<0){ //检查指定范围
   System.out.println("范围必须大于0");
   return null;
  }
  boolean[] primes= new boolean[num+1];//声明boolean类型数组 长度为范围+1
  primes[1]=false; //将特殊数字1抛出,因为1不是质数
  Arrays.fill(primes,2,num+1,true);  //将布尔数组元素的值都赋为true
  int n=(int)Math.sqrt(num); //求开方                 不清楚这里开始  为什么开方啊
  for(int i=1;i<n;i++){
   if(primes){ //如果是质数,那么i的倍数不是质数
    for(int j=2*i;j<=num;j+=i){
     primes[j]=false;
    }
   }
  }
  return primes;//到这里结束   这个区间不太理解   求解释
}
public static void showPrimeNumber(int num){ //显示质数
  boolean []primes=primeNumber(num);
  int n=0;
  if(primes!=null){
   for(int i=1;i<primes.length;i++){ //循环数组操作数组的元素
    if(primes){//如果数组元素为真 ,则下标值为质数
     System.out.print(i+" ");  //输出质数
     if(++n%10==0)  //以每行10个质数输出
      System.out.println();
    }
   }
   System.out.println();
  }
  System.out.println("一共有"+n+"个");
}
}

7 个回复

倒序浏览
要解释哪部分呀?重点标出来,可见你对于问题也不上心。
别人回不回答是别人的事,你认不认真对待就是你的问题了。
可能我说的话刺伤了你。我们学了知识是自己的。
回复 使用道具 举报
张天昊76 发表于 2013-11-27 21:07
要解释哪部分呀?重点标出来,可见你对于问题也不上心。
别人回不回答是别人的事,你认不认真对待就是你的 ...

亲 你看程序了吗
回复 使用道具 举报
素数又叫质数,反义词就是合数。合数是由若干个质数相乘而得来的,所以,没有质数就没有合数。
拿到一个数,可以把它整除一个数进行拆分,这个数除了1和它自身之外还有其它数,那这个拿到的数就是合数。
拆分到最后就是1、2、3等等的质数相乘得来。若不是质数那么还可以拆分那,废话!不能拆分的话那就是质数了。
那么这个程序的原理就是排除法,将给定的100以内的所有合数排除。
因为如果一个数不是素数是合数,
那么一定可以由两个自然数相乘得到,
其中一个大于或等于它的平方根,一个小于或等于它的平方根。并且成对出现。
那么我们只要可以找到小于这个平方根的数排除就可以了。你的源码的意思就是排除这些。
其实你上面的源码不够严谨,因为求平方根时候把小数舍去了,int强制转换嘛。所以当数字是143时,143=13*11,所以是合数,不是质数,但你的源码却输出这个143也是素数。
143的开方是11.9多,要按照12*12=144的范围进行排除。
还有你的源码里部分逻辑不严谨,看下下面的输出结论就知道了,第一次是143,随后的是144,因为144是合数,所以看不出错误,但是第一次的121=11*11啊,却显示出来了。

  1. 范围在143内的质数有:
  2. 2 3 5 7 11 13 17 19 23 29
  3. 31 37 41 43 47 53 59 61 67 71
  4. 73 79 83 89 97 101 103 107 109 113
  5. 121 127 131 137 139 143
  6. 一共有36个
复制代码
  1. 范围在144内的质数有:
  2. 2 3 5 7 11 13 17 19 23 29
  3. 31 37 41 43 47 53 59 61 67 71
  4. 73 79 83 89 97 101 103 107 109 113
  5. 127 131 137 139
  6. 一共有34个
复制代码


根据原理,下面的代码就可以实现:
  1. /*列出素数
  2. * 在所有整数中,除啦1之外的所有数中,只能整除1和他本身的数,这种数叫质数或素数
  3. *
  4. */
  5. import java.util.*;

  6. public class ForCycle_06 {

  7. public static void main(String[] args){
  8.   int num=143;  //声明求质数的范围
  9.   System.out.println("范围在"+num+"内的质数有:");
  10.   showPrimeNumber(num);  //调用方法显示质数
  11. }

  12. private static boolean isJudge(int n)
  13. {
  14.   int i;
  15.   if(n==1) //1不是
  16.     return false;
  17.   if(n==2) //2是
  18.     return true;
  19.   int k = (int)Math.sqrt(n)+1; //平方根+1
  20.   for(i=2;i<=k;i++)
  21.     if(n%i==0)return false; //排除

  22.   return true; //是素数
  23. }

  24. private static void showPrimeNumber(int num){ //显示质数
  25.   boolean[] primes = new boolean[num+1];

  26.   for(int i = 1; i < primes.length; i++)
  27.     primes[i] = isJudge(i); //素数判断

  28.   int n=0;

  29.    for(int i=1;i<primes.length;i++){ //循环数组操作数组的元素
  30.     if(primes[i]){//如果数组元素为真 ,则下标值为质数
  31.      System.out.print(i+" ");  //输出质数
  32.      if(++n%10==0)  //以每行10个质数输出
  33.       System.out.println();
  34.     }
  35.    }
  36.    System.out.println();

  37.   System.out.println("一共有"+n+"个");
  38. }
  39. }
复制代码
回复 使用道具 举报
qq379264347 发表于 2013-11-27 22:50
素数又叫质数,反义词就是合数。合数是由若干个质数相乘而得来的,所以,没有质数就没有合数。
拿到一个数 ...

thankyou.......
回复 使用道具 举报
得到一个数N,计算这个数以内的素数,那么要把这个数向上扩充到能直接开方到整数的值X。
X=A*A    那么(A)*(A+1)就超过范围了,前面的(A)就大了,要往下减1试验,就是小于平方根A咯,所以排除平方根以及平方根以下的数能不能被整除就行了。呵呵。多想想的确,省去了很多事。最终结果要小于等于N那,可不是自己扩充后的X。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马