第十四届蓝桥杯三月真题刷题训练——第 9 天

第 1 题:找素数  

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

素数就是不能再进行等分的整数。比如:7,11。而 9 不是素数,因为它可以平分为 3 等份。一般认为最小的素数是22,接着是 3,5,...

请问,第 100002(十万零二)个素数是多少?

请注意:“2”是第一素数,“3” 是第二个素数,依此类推。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

代码:(普通筛)

package 第十四届蓝桥杯三月真题刷题训练.day9;

/**
 * @author yx
 * @date 2023-03-12 18:43
 */
public class 找素数 {
    public static void main(String[] args) {
        int ans=0;
        int i=2;
        while (true){
            if(isPrime(i)){
                ans++;
                if(ans==100002){
                    System.out.println(i);
                    return;
                }
            }
            i++;
        }
    }
    static boolean isPrime(int n){
            for (int i = 2; i <= Math.sqrt(n) ; i++) {
                if(n%i==0){
                    return false;
                }
            }
            return true;
        }
}

代码:(欧拉筛)

package 第十四届蓝桥杯三月真题刷题训练.day9;

public class 欧拉筛 {
    public static void main(String[] args) {
        //默认false为质数
        int N=10000000;//N不能给太大,否则会爆栈
        boolean[] isPrime = new boolean[N];
        int[] prime=new int[N];
        isPrime[0]=isPrime[1]=true;//0,1都不是质数
        int temp=0;
        for (int i = 2; i < N; i++) {
            if(!isPrime[i]){
                prime[temp++]=i;
                if(temp==100002){
                    System.out.println(i);
                    return;
                }
            }
            for (int j = 0; j < temp && i*prime[j]<N; j++) {//i*prime[j]<N防止越界
                isPrime[i*prime[j]]=true;//标记为非素数、
                if(i%prime[j]==0)break;//防止重复标记
            }
        }
    }
}

贴一个讲的不错的视频:

欧拉筛【力扣周赛 326】LeetCode_哔哩哔哩_bilibili本节讲了如何线性筛质数(也叫欧拉筛)。欢迎一键三连,在评论区发表你对这场周赛的体会。, 视频播放量 4432、弹幕量 13、点赞数 257、投硬币枚数 189、收藏人数 76、转发人数 12, 视频作者 灵茶山艾府, 作者简介 算法讲师 | 力扣竞赛 Top10 | 全网刷题量 7000+,相关视频:我上次在代码中看到算法,还是一个刚毕业不久的同事用了一个分治+回溯,没考虑空间复杂度导致线上OOM……,求素数【欧拉筛法】,并查集 最小堆【力扣周赛 323】,外国佬用Neovim写代码,有点武侠比武的代入感,欧拉筛,几行就行,一次就好,y总,你当年的同学都年薪百万了吗 | 力扣第326场周赛,蓝桥杯算法学习路线 | 全程制作过程公开,Leetcode 第326场周赛国服36名菜鸡实况解说:2023从一场超级手速场开始......,一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解,ACM金牌可以在大厂乱杀吗?https://www.bilibili.com/video/BV1H8411E7hn/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=eb072ba6b610daa77b0adfe79fcc5879

第 2 题:图书排列_dfs板子

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

将编号为 1 ~ 10 的 10 本书排放在书架上,要求编号相邻的书不能放在相邻的位置。

请计算一共有多少种不同的排列方案。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

代码:

之前写过一摸一样的dfs板子,改一下check函数即可食用

真题传送:第十四届蓝桥杯三月真题刷题训练——第 4 天_小羊不会飞的博客-CSDN博客

package 第十四届蓝桥杯三月真题刷题训练.day9;

/**
 * @author yx
 * @date 2023-03-12 20:18
 */
public class 图书排列_dfs {
    static int[] nums = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    static int ans = 0;
    static int to = 9;

    public static void main(String[] args) {
        dfs(0);
        System.out.println(ans);
    }

    //from是数组交换位置的头指针(依次会+1),to是尾指针相当于哨兵的作用,当from==to的时候退出
    static void dfs(int from) {
        if (from == to) { //递归的出口
            check();//检查是否相邻
        } else {
            for (int i = from; i <= to; i++) {
                swap(from, i);
                dfs(from + 1);
                //回溯恢复
                swap(from, i);
            }
        }
    }

    static void swap(int a, int b) {
        int temp = nums[a];
        nums[a] = nums[b];
        nums[b] = temp;
    }

    static void check(){
        for (int i = to; i >= 1; i--) {
            if(Math.abs(nums[i]-nums[i-1])==1){
                return;
            }
        }
        ans++;
    }
}

看了一晚上欧拉筛,明天补题,先跑步去了

第 3 题:日志统计

第 4 题:   杨辉三角   

猜你喜欢

转载自blog.csdn.net/m0_55858611/article/details/129479275