MENU

第四届蓝桥杯 Java B—— 幸运数

March 2, 2019 • Read: 3436 • 算法阅读设置

幸运数是波兰数学家乌拉姆命名的。它采用与生成素数类似的 “筛法” 生成。

首先从 1 开始写出自然数 1,2,3,4,5,6,....

1 就是第一个幸运数。
我们从 2 这个数开始。把所有序号能被 2 整除的项删除,变为:

1 3 5 7 9 ....

把它们缩紧,重新记序,为:

1 3 5 7 9 .... 。这时,3 为第 2 个幸运数,然后把所有能被 3 整除的序号位置的数删去。注意,是序号位置,不是那个数本身能否被 3 整除!!删除的应该是 5,11, 17, ...

此时 7 为第 3 个幸运数,然后再删去序号位置能被 7 整除的 (19,39,...)

最后剩下的序列类似:

1, 3, 7, 9, 13, 15, 21, 25, 31, 33, 37, 43, 49, 51, 63, 67, 69, 73, 75, 79, ...

本题要求:

输入两个正整数 m n, 用空格分开 (m < n < 1000*1000)
程序输出 位于 m 和 n 之间的幸运数的个数(不包含 m 和 n)。

例如:
用户输入:
1 20
程序输出:
5

例如:
用户输入:
30 69
程序输出:
8

资源约定:
峰值内存消耗(含虚拟机) < 64M
CPU 消耗 < 2000ms

  • import java.util.LinkedList;
  • import java.util.List;
  • import java.util.Scanner;
  • public class Main {
  • public static void main(String[] args) {
  • Scanner sc = new Scanner(System.in);
  • int n = sc.nextInt();
  • int m = sc.nextInt();
  • List<Integer> list = new LinkedList<>();
  • for (int i = 1; i <= m; i++) {
  • list.add(new Integer(i));
  • }
  • int luck = 2; // 幸运数
  • int k = 1; // 下标
  • List<Integer> remove = new LinkedList<>(); // 等待被移除的数字
  • while (luck <= list.size()) {
  • int cnt = 0;// 代表list中目前删除了几个数字
  • for (int i = luck; i <= list.size(); i++)
  • if (i % luck == 0)
  • remove.add(i);
  • for (int j = 0; j < remove.size(); j++)// 将下标为remove中的数字移除
  • list.remove(remove.get(j) - (cnt++) - 1);
  • remove.clear();
  • luck = list.get(k++);
  • }
  • int count = 0;
  • for (int i = 0; i < list.size(); i++)
  • if (list.get(i) > n && list.get(i) < m)
  • count++;
  • System.out.println(count);
  • }
  • }
Archives Tip
QR Code for this page
Tipping QR Code