您的位置:首页 > 其它

蓝桥杯:幸运数

2017-05-03 22:35 471 查看
幸运数

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

    首先从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

注意他说的最后的序列 不只是除去2.3.7位置上的数 还要继续算到不能算

import java.util.ArrayList;
import java.util.Scanner;

public class Main{
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
int m=s.nextInt();
int n=s.nextInt();
if(m>=n||m<=0||m>=1000000||n<=0||n>=1000000) return;
int a=seek(m,n,dft(n));
System.out.println(a);
}
public static ArrayList<Integer> dft(int b){
ArrayList<Integer> k=new ArrayList<>();
int luck=1;
for(int i=0;i<b;i++){//加上0 以方便后面的计算 最后移除即可
k.add(i);
}
while(luck<b){
if(luck>=k.size()) break;
int c=0;
if(luck==1)c=2;
else c=k.get(luck);
for(int i=k.size()-1;i>=c;i--){
if(i%c==0)
k.remove(i);
}
luck++;
}
k.remove(0);
return k;
}
public static int seek(int a,int b,ArrayList<Integer> k){
int count=0;
for(int i:k){
if(i>a&&i<b)
count++;
}
return count;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: