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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 顾亦飞 于 2012-7-2 18:48 编辑

在网上看到一个代码,说是取1-200之间的质数..
  • public class Sshu {
  •     public static void main(String[] args) {
  •         int i, j;
  •         for(i=101; i<=200; i+=2) {
  •             for(j=2; j<i/2; j++) { //也可以使用j<i-1;
  •                 if(i % j == 0) break;
  •                 }
  •                 if(i % j != 0) {
  •                     System.out.println(i + "是素数");
  •             }
  •         }
  •     }
  • }


大家说说看.为什么用j<i/2也可以用作条件表达示呢, 它和j<i-1有什么区别.?   
      j<i/2 什么情况下不会满足.  j<i-1 则是到J大于100的时候不满足.  这两个条件会是相同吗?

11 个回复

倒序浏览
楼主的代码没有发全哦
   这个i/2  应该是在判断是否能被整除的时候的吧  一个数如果不能被小于他的一半的数整除  那比它一半大的数也不能整除它的   所以用它的一半来判断就可以了 节约运行时间.....

点评

j<i/2 什么情况下不会满足. j<i-1 则是到J大于100的时候不满足. 这两个条件会是相同吗?  发表于 2012-7-2 18:47
回复 使用道具 举报
主要是减少判断次数,i/2可以用i>>1表示,计算机位运算效率比较高
还有,你代码挂了,看不到。。。
回复 使用道具 举报
哈哈 挂啦
回复 使用道具 举报
本帖最后由 蒋映辉 于 2012-7-2 21:38 编辑
蒋映辉 发表于 2012-7-2 18:39
楼主的代码没有发全哦
   这个i/2  应该是在判断是否能被整除的时候的吧  一个数如果不能被小于他的一半的 ...


  •   for(j=2; j<i/2; j++) { //也可以使用j<i-1;
  •                 if(i % j == 0) break;
  •                 }
  •                 if(i % j != 0) {
  •                     System.out.println(i + "是素数");
  •             }
意思是  如果I不能被小于j的一半的那些数整除  那么剩下那一半的数字也不能整除它。
回复 使用道具 举报
本帖最后由 Forever。 于 2012-7-2 23:00 编辑

楼主这个问题其实可以说是一个数学上的问题了。素数就是除了1和他本身没有书可以被他整除。
就这个程序这么写来说。假如被除数不是一个质数他可以被2,3,4,5……好多数整除。但是他一定不会被比他的1/2还大的数字整除。因为那一定是一个假分数。比如5/3,9/6,
10/6……所以说在继续的除下去没有任何的意义了。

我觉得楼主这个方法写的非常好,我整理了一下代码做了一个小小的修改,其实也不是修改,这样更加有利于初学者看的懂:
public class Sshu {
    public static void main(String[] args) {
        int i, j;
        for(i=1; i<=200; i+=2) {
            for(j=2; j<i/2; j++) {第二个for循环实际上只循环了第一个if,其实第一个for循环的结果只有两个第一就是遇到一个可以被整除的数字,然后break。第二,就是循环完毕也没有找到一个可以被整除的
                    if(i % j == 0)
                    { //也可以使用j<i-1;
                            break;
                    }
            }
            if(i % j != 0) 在这个if这里就是判断到底是遇到了上面的那种情况,如果是第一种情况,那么如果是被整除了,就直接跳过不打印,反之打印。
            {
                System.out.println(i + "是素数");
            }
        }
    }
}


总之我觉得这个算法写的非常好!

点评

是不可以被2,3,4,5....的数整除,那么比他还大1/2的数肯定不能被整除。因为如果可以被2,3,这些数整除的那么就跳出循环了。  发表于 2012-7-2 23:18
回复 使用道具 举报
蒋映辉 发表于 2012-7-2 21:37


  •   for(j=2; j

  • 想了好久,是这么回事。应当I不能被小于I的一半那些数整除,那么后面的肯定不能整除。
    回复 使用道具 举报
    顾亦飞 发表于 2012-7-2 23:14
    想了好久,是这么回事。应当I不能被小于I的一半那些数整除,那么后面的肯定不能整除。 ...

    加入I=5, 他有必要再去除3了么……
    回复 使用道具 举报
    Forever。 发表于 2012-7-2 23:31
    加入I=5, 他有必要再去除3了么……

    程序在判断过程中是用i/2来做为for循环的条件。之所以用它是为了提高效率。那I=5去除3话的话,只不过是多进行了一次判断。
    回复 使用道具 举报
    顾亦飞 发表于 2012-7-2 23:47
    程序在判断过程中是用i/2来做为for循环的条件。之所以用它是为了提高效率。那I=5去除3话的话,只不过是 ...

    我说得正是此意
    回复 使用道具 举报

    j<i/2只是为了提效率。

    本帖最后由 黑马-李勇 于 2012-7-3 03:43 编辑

    j<i/2只是为了提效率。
    回复 使用道具 举报
    蒋映辉 发表于 2012-7-2 21:37


  •   for(j=2; j

  • j<i/2确实是提升了效率,但这还不是最有效率的方式,最有效率的应该是 j<=Math.sqrt(i); 这只需要除到 i 的平方根就行了,举个例子,对于9来说,它的一半是4.5,它的平方根是3,这样一比较效率应该看出来了吧。

    点评

    恩咯 是的 以前玩acm的时候玩过这些的...  发表于 2012-7-3 10:41

    评分

    参与人数 1技术分 +1 收起 理由
    蒋映辉 + 1

    查看全部评分

    回复 使用道具 举报
    您需要登录后才可以回帖 登录 | 加入黑马