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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© aiq黑马程序员 中级黑马   /  2014-7-2 11:22  /  1415 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

      for (j=2;j<=100;j++)
    {     for ( i=2;i<=j;i++ )
               if ( j%i==0)
                  breaker;
    }
     if (i>j/2)
{
         System.out.println(""+j+"是素数");
}

if(i>j/2)这句作用是什么?为什么感觉这句是废话啊?谁能把这句解释一下啊?

8 个回复

倒序浏览
是为了排除i和j都等于2的情况吧
回复 使用道具 举报 1 0
                System.out.println("2是素数");
                for(int j=2;j<=100;j++){     
                        for (int i=2;i<j;i++ ){
                                if (j%i==0)
                                        break;
                                if (i>j/2){
                                        System.out.println(j+"是素数");
                                        break;
                                }
                        }
                }

修改了你的代码,完整的输出了100以内的素数;
i>j/2的意思是:比如97,当除到49的时候,都没有发现2-49有哪个数是97的因素,就说明97是质数了;因为如果97除一个值是自己1/2的数能整除,那必然商是2.

附自己以前实现的一个方法,给你参考下:

        //打印质数
        public static void printPrimeNumber(){
               
                System.out.println(2);
               
                for(int x=3;;x+=2){
                        int sqrt = (int) Math.sqrt(x)+1;

                        int count = 0;
                        out:
                        for(int y=3;y<sqrt;y++){
                                if(x%y==0){

                                        count++;
                                        break out;
                                }
                        }
                        if(count==0)
                                System.out.println(x);
                }
        }
回复 使用道具 举报 1 0
这句话是不能省略的, i>j/2  时才能说明这个 j 是素数,觉得这样写程序会不方便阅读。举个例子,11是个素数,我只需要在2--5找,看能不能找到整除11的数,找不到就说明11是素数。
回复 使用道具 举报
不过这样写程序不是很好,不方便人家阅读,给你我写的程序吧,这是今早的面试程序题,只能帮你到这里了
public class SushuTest {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
              //输出1到10之间的素数
                sushu(1,10);
        }

        public static void sushu(int a,int b) {
        boolean flag ;
               
                for (int i = a; i < b; i++) {        
                         flag= true;  //一开始假设i是素数
                         if(i==1) flag=false;
                        for (int j = 2; j <= i / 2; j++) {                        
                                if (i % j == 0) {
                                        flag = false; //能够被其他数整除,不是素数
                                        break;
                                }
                        }

                        if (flag)
                                System.out.println(i);  //输出素数

                }

        }
}
回复 使用道具 举报 1 0
楼主的代码有bug,我猜你是这个意思吧:
  1. for (j=2;j<=100;j++) {
  2.     for ( i=2;i<j;i++ )
  3.                 if ( j%i==0)
  4.                   break;
  5.      if (i>j/2)
  6.     {
  7.           System.out.println(""+j+"是素数");
  8.     }

复制代码


出了内层循环的时候,无法确定到底是break出来的,还是正常走完循环出来的,if(i>j/2)就是用来判断这个的。因为j>3时,j/2>=sqrt(j),所以如果i>j/2,i>sqrt(j),那么就不可能是break跳出来的。因为如果是break出来的,那么j/i一定比i小,而且j % (j/i) == 0,根本到不了i就应该break出循环了。既然不是break出来的,那么就说明是素数,反之不是素数。

回复 使用道具 举报 1 0
大哥。能不能把代码写工整一点呢。
回复 使用道具 举报
小周务商 发表于 2014-7-2 20:43
大哥。能不能把代码写工整一点呢。

我主要是问那一句的意思,没来得及把代码打全,请见谅
回复 使用道具 举报
谢谢大家了,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马