解题思路:在看了真题解析后,我觉得他给出的方法较为繁琐,即每次删除后依次将后数组元素向前移,要准确的设置哨兵及指针上下限,我在题中,用的方法是直接将要删除的元素给他赋值为0,相当于占位,后续选择只需加以条件,便可忽略掉这些被删除的值。
解题难点:这个题还是比较坑,题中给的例子,让我移位,幸运数到7就截止了,然后得到和他那个一样的数列,然后进行筛选比对就行了,没想到人家要一直进行幸运数筛选,直到筛选无意义为止(即筛选间隔超过了数组长度),所以又进行了代码再改动!
package 蓝桥杯;
import java.util.Scanner;
public class 省_幸运数 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
//定义范围上下限
int n = in.nextInt();
int m = in.nextInt();
int[] arr = new int[m/2];
//先做一轮筛选,将数组都填上奇数
for (int i = 0; i < m/2; i++)
arr[i] = i*2+1;
//开始依次进行幸运数筛选
int k = 1;
while (true){
//arr[K]中存放的即为幸运数,当他的大小超过数组长度,就可以结束循环
if(arr[k] > m/2)
break;
//设置计数器
int add = 0;
//遍历依次筛选幸运数
for (int i = 0; i < m/2; i++) {
if(arr[i] == 0)
continue;
add++;
if(add % arr[k] == 0){
add = 0;
arr[i] = 0;
}
}
k++;
while (arr[k] == 0) k++;
}
//找到上限指针
int flag = 0;
for (int i = 0; i < m/2; i++) {
if(arr[i] >= n){
flag = i;
break;
}
}
//从上限开始依次遍历累加,计算幸运数个数
int add = 0;
for (int i = flag; i < m/2; i++) {
if(arr[i] == 0 || arr[i] == n)
continue;
else{
if(arr[i] >= m)
break;
add++;
}
}
System.out.print(add);
}
}