第十四届蓝桥杯三月真题刷题训练——第 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++;
}
}
看了一晚上欧拉筛,明天补题,先跑步去了