• 判断100以内的质数(素数)


    public class Demo3 {
    
        public static void main(String[] args) {
    
            boolean b;
            for (int i = 2; i < 100; i++) {    //遍历2-100的所有数
                b = true;
                int k = (int) Math.sqrt(i);    //开平方
                for (int j = 2; j <= k; j++) {
    
                    if (i % j == 0) {        
    
                        b = false;
                        break;
                    }
                }
                if (b) {
                    System.out.println(i);
                }
    
            }
        }
    }

    在这里,有2个关键的变量,我估计解释一下你就能看得明白这个算法了.
    1.关于变量k.变量k的作用是优化整个算法,因为比如要判断一个数13是不是素数,我们没必要从2循环到13.只要循环到对13开根号.13开根号大概是3.6多,强转为int类型后是3.也就是说只要检查2,3是否能整除13.如果不能,13肯定是一个素数.因为比如48这个数,你前面检测到被4整除等于12,那么继续循环超过Math.sqrt(48)的话,无非就是得到一个反过来的被12除等于4的结果.这个没有必要.

    2.关于变量j.注意点1:j是在最外层的循环体中定义的.这个时候刚定义完,j的值是初始的0.然后j从2开始,一直到小于等于k结束.这里是控制尝试整除的循环次数.一旦发现在这个范围内有数能整除i,那么就跳出循环.

    所以,对于你不理解的那个部分,首先确定一点,程序只要执行到break,就说明这个数是素数.
    例如我们这次k = 10,那么是要从j = 2到10逐一检测 i 是不是能被 j 整除.当j = 7的时候比如可以整除了,就跳出当前内层循环了.这时候, j 显然是不大于 k 的,因为只要是中途跳出,因为内层循环(j = 2; j <= k; j++)的控制,只要在循环过程中跳出来的,那么j 肯定 <= k.

    只有循环到j = 10依然没有break的话,根据for循环的执行顺序,会执行j++,然后去判断j <= k 是否为true,为true则继续下一次循环,否则循环结束.而在这里,如果到10还没有能够整除的话,j是会在10的基础上自增的.这时候j就=11了.

    那么if ( j > k )就不成立了,则i 不会被输出.

    总结一点:就是如果中途or最后一次循环,找到能整除的数了,那么因为break的关系,最后就不会执行 j++, 所以j <= k的条件是能保证的. 换言之,如果j > k (亦即j <= k 的取反)表示没有找到能整除的数.其实j最大也就只能等于k+1.

    当然还有一种投机取巧的办法。看代码。。。

    public static void main(String[] args){
            
            System.out.println("2");
            System.out.println("3");
            System.out.println("5");
            System.out.println("7");
            for(int i=10; i<100; i++){
                
                if(i%2!=0 && i%3!=0 && i%5!=0 && i%7!=0){
                    System.out.println(i);
                }
                
            }
            
        }
  • 相关阅读:
    【POJ1958】汉诺塔+
    hdu 5067(暴力搜索)
    hdu 5063(思路题-反向操作数组)
    hdu 5062(水题)
    hdu 2227(树状数组+dp)
    hdu 5480(维护前缀和+思路题)
    hdu 2492(树状数组)
    hdu 1394(树状数组)
    poj 2299(离散化+树状数组)
    poj 3321(树状数组)
  • 原文地址:https://www.cnblogs.com/zyh1994/p/5399803.html
Copyright © 2020-2023  润新知