鞍山网站建设工作室广告公司图片
第 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++;}
}
看了一晚上欧拉筛,明天补题,先跑步去了