zoukankan      html  css  js  c++  java
  • 判断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);
                }
                
            }
            
        }
  • 相关阅读:
    JVM 综述
    看 Netty 在 Dubbo 中如何应用
    Netty 心跳服务之 IdleStateHandler 源码分析
    Netty 高性能之道
    Netty 解码器抽象父类 ByteToMessageDecoder 源码解析
    Netty 源码剖析之 unSafe.write 方法
    Netty 出站缓冲区 ChannelOutboundBuffer 源码解析(isWritable 属性的重要性)
    Netty 源码剖析之 unSafe.read 方法
    Netty 内存回收之 noCleaner 策略
    Netty 源码阅读的思考------耗时业务到底该如何处理
  • 原文地址:https://www.cnblogs.com/zyh1994/p/5399803.html
Copyright © 2011-2022 走看看