首页 > 其他分享 >面试题:求[2, n)之间的素数个数

面试题:求[2, n)之间的素数个数

时间:2024-08-21 12:37:16浏览次数:8  
标签:面试题 int isPrimes 个数 素数 Boolean static public

题目:求[2, n)之间的素数个数
素数的定义:
素数是指大于1的自然数,除了1和它本身之外没有其他因数的数。也就是说,素数只能被1和它本身整除,不能被其他自然数整除。

解法1
最简单的实现思路是,实现素数判断函数,然后从2~n逐个判断,然后统计素数个数

public static int countPrimes(int n) {
        if(2== n){
            return 1;
        }
        int count =0;
        for(int i=2;i<n;i++){
            if(isPrime(i)){
                count++;
            }
        }
        return count;
    }
 
    public static Boolean isPrime(int n) {
        for(int i=2;i<n;i++){
            if(0 == n%i){
                return Boolean.FALSE;
            }
        }
        System.out.println("prime=" + n);
        return Boolean.TRUE;
    }

  

解法2

        观察非素数的特点,如6为非素数,它除了被1和6本身整除外,6=2*3=3*2 ,所以实际上述判断时我们判断i<sqrt[n]即可,则算法改造如下:

 public static int countPrimes_2(int n) {
        if(2== n){
            return 1;
        }
        int count =0;
        for(int i=2;i<n;i++){
            if(isPrime_2(i)){
                count++;
            }
        }
        return count;
    }
    public static Boolean isPrime_2(int n) {
        for(int i=2;i*i<=n;i++){
            if(0 == n%i){
                return Boolean.FALSE;
            }
        }
        System.out.println("prime=" + n);
        return Boolean.TRUE;
    }

  

解法3:

        再观察一下素数的整数倍,都不是素数,比如2*2=4,2*3=6,2*4=8,2*5=10...都不是

则看可以改造算法如下:初始化所有元素都是素数,然后按照素数的整数倍不是素数赋值,然后再统计素数个数

 public static int countPrimes_3(int n) {
        Boolean[] isPrimes = new Boolean[n];
        Arrays.fill(isPrimes,Boolean.TRUE);
        for(int i=2;i<n;i++){
            if(isPrimes[i]){
                for(int j=2*i;j<n;j+=i){
                    isPrimes[j] = false;
                }
            }
        }
        int count =0;
        for(int i=2;i<n;i++){
            if(isPrimes[i]){
                count++;
            }
        }
        return count;
    }

  

解法4

        结合2,3结论,i只要到sqrt[n]即可,而6=2*3=3*2是对称的,最终优化的算法如下

public static int countPrimes_4(int n) {
        Boolean[] isPrimes = new Boolean[n];
        Arrays.fill(isPrimes,Boolean.TRUE);
        for(int i=2;i*i<n;i++){
            if(isPrimes[i]){
                for(int j=i*i;j<n;j+=i){
                    isPrimes[j] = false;
                }
            }
        }
        int count =0;
        for(int i=2;i<n;i++){
            if(isPrimes[i]){
                count++;
            }
        }
        return count;
    }

  

标签:面试题,int,isPrimes,个数,素数,Boolean,static,public
From: https://www.cnblogs.com/yangh2016/p/18371360

相关文章

  • TCP,UDP,Socket,Http网络编程面试题 47道
    1.什么是网络编程        1.网络编程的本质是多台计算机之间的数据交换。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给其他设备,然后接受另外一个设备反馈的数据。现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另......
  • 最大连续1的个数 III(LeetCode)
    题目        给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。解题deflongestOnes(nums,k):left=0max_len=0zero_count=0forrightinrange(len(nums)):#如......
  • Java面试题--JVM大厂篇之未来已来:为什么ZGC是大规模Java应用的终极武器?
           ......
  • springboot自动配置原理-面试题
    网络上看很多文章并没什么用,重点没说到,不知道从那里入手讲,刷到的直接按照下面这个,背出来就行了1、当启动springboot应用程序的时候,会先创建SpringApplication的对象,在对象的构造方法中会进行某些参数的初始化工作,最主要的是判断当前应用程序的类型以及初始化器和监听器,在这个......
  • Java笔试面试题AI答之线程(2)
    文章目录7.如何确保N个线程可以访问N个资源同时又不导致死锁?1.资源排序与顺序访问2.资源分配策略3.避免占用并等待4.引入超时机制5.死锁检测与解决6.使用高级并发工具7.编程实践8.Java方法可以同时即是static又是synchronized的吗?9.什么是Java多线程同步?10......
  • day6 哈希表part01: 242.有效的字母异位词|349. 两个数组的交集|202. 快乐数|1. 两数
    242.有效的字母异位词 classSolution{publicbooleanisAnagram(Strings,Stringt){int[]record=newint[26];//a=97.soa-a=0,b-a=1.直接使用减法,不用记acii码值。//遍历第一个string++,遍历第二个string--.数组里的数字......
  • Leetcode面试经典面试题-81.搜索旋转排序数组II
    解法都在代码里,不懂就留言或者私信,这个题目一定要注意重复元素的情况shpublicstaticbooleansearch(int[]nums,inttarget){/**空数组不可能找到任何数*/if(nums==null||nums.length==0){returnfalse;}/**如果......
  • 274471是素数吗?
    GPT-4o(OpenAI)为了判断274471是否是素数,我们需要确认它是否只有两个正因数:1和它本身。为此,我们可以检查它是否能被小于等于其平方根的任何素数整除。274471的平方根大约是523.95,因此我们需要检查它是否能被小于等于523的素数整除。为了简化过程,我们可以使用编程或......
  • nginx基础面试题
    1、破解密码:1、首先重启虚拟机,启动的时候马上按e键进入安全模式2、在有Linux那行的最后面加上rd.break3、ctrl+x将文件4、以读写的方式重新挂载:mount-oremount,rw/sysroot5、进入路径:chroot/sysroot6、改写密码:passwd6、打安全标签:touch/.autorelabel7、退......
  • .NET面试题系列(27)反射
    序言 应该场景数据库对象转实体 publicstaticList<T>TableToList<T>(DataTabletable)whereT:classORMAutoMapperSystem.TypeSystem.Type类对于反射起着核心的作用。但它是一个抽象的基类,Type有与每种数据类型对应的派生类,我们使用这个派生类的对象的方法、字段......