蓝桥杯 幸运数(Java)

解题思路:在看了真题解析后,我觉得他给出的方法较为繁琐,即每次删除后依次将后数组元素向前移,要准确的设置哨兵及指针上下限,我在题中,用的方法是直接将要删除的元素给他赋值为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);
    }
}

猜你喜欢

转载自blog.csdn.net/baldicoot_/article/details/104782294