题目描述
幸运数是波兰数学家乌拉姆命名的。它采用与生成素数类似的"筛法"生成。
首先从 1 开始写出自然数 1,2,3,4,5,6,⋯
1 就是第一个幸运数。
我们从2 这个数开始。把所有序号能被 22 整除的项删除,变为:
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<106)。
输出描述
输出位于 m 和 n 之间的幸运数的个数(不包含 m 和 n )。
输入输出样例
示例
输入
1 20
输出
5
运行限制
最大运行时间:2s
最大运行内存: 64M
总通过次数: 754 | 总提交次数: 870 | 通过率: 86.7%
难度: 简单 标签: DFS, 枚举, 2013, 省赛
源码:
import java.util.Scanner;
public class 幸运数 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int m=scanner.nextInt();
int n=scanner.nextInt();
int[] a=new int[n];
for (int i = 0; i < n; i++) {
a[i]=i*2+1;
}
int index=1;
while(true) {
int p=index+1;
for (int i = p; i < n; i++) {
if ((i+1)%a[index]!=0) {
a[p]=a[i];
p++;
}
}
index++;
if(a[index]>=n) break;
}
int sum=0;
for (int i = 0; i < n; i++) {
if (a[i]>m && a[i]<n) {
sum++;
}
}
System.out.println(sum);
}
}