幸运数是波兰数学家乌拉姆命名的。
它采用与生成素数类似的“筛法”生成。
首先从 11 开始写出自然数 1 2 3 4 5 6....
。
11 就是第一个幸运数。
我们从 22 这个数开始。
把所有序号能被 22 整除的项删除,变为:
1 _ 3 _ 5 _ 7 _ 9 ....
把它们缩紧,重新记序,为:1 3 5 7 9 ....
。
这时,33 为第 22 个幸运数,然后把所有能被 33 整除的序号位置的数删去。
注意,是序号位置,不是那个数本身能否被 33 整除!!
删除的应该是 5 11 17...
。
此时 77 为第 33 个幸运数,然后再删去序号位置能被 77 整除的(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� 之间的幸运数的个数(不包含 m� 和 n�)。
数据范围
0<m<n<1060<�<�<106
输入样例1:
1 20
输出样例1:
5
import java.util.Scanner;
public class 幸运数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int m=sc.nextInt();
int n=sc.nextInt();
int[]a=new int[n];
for(int i=0;i<n;i++) {//存奇数1 3 5 7
a[i]=2*i+1;
}//删偶数
int l=1;//幸运数下标
while(true) {
int p=l+1;
for(int i=l+1;i<n;i++) {
if((i+1)%a[l]==0) {}
else {
a[p]=a[i];
p++;
}
if(a[i]>n)break;
}
l++;
if(a[l]>=n)break;
}
int ans=0;
for(int i=0;i<n;i++) {
if(a[i]>=n)break;
if(a[i]>m)ans++;
}
System.out.print(ans);
}
}