[蓝桥杯][历届试题]幸运数

时间限制: 1Sec 内存限制: 128MB 提交: 39 解决: 20

题目描述
幸运数是波兰数学家乌拉姆命名的。它采用与生成素数类似的“筛法”生成 
。  
首先从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)。  
样例输入
30  69  
样例输出
8
#define maxn 500010
#include<stdio.h>
int a[maxn],b[maxn];
int ptr,n,m,num_a,num_b;
void solve()
{
    a[0]=-1;
    for(int i=1;i<=n;i++) a[i]=a[i-1]+2;
    b[1]=1;b[2]=3;
    ptr=2;
    num_a=n;
    num_b=2;
    while(ptr+a[ptr]<=num_a)
    {
        num_b=1;
        for(int i=1;i<=num_a;i++)
            if(i%a[ptr]!=0) b[num_b++]=a[i];
        num_a=num_b-1;
        for(int i=1;i<=num_a;i++) a[i]=b[i]; 
        ptr++; 
    }
}
int main(void)
{
    int sum = 0;
    scanf("%d%d",&m,&n);
    solve(); 
    for(int i=1;i<=num_a;i++)
        if(a[i]>m && a[i]<n) sum++;
    printf("%d",sum);
    return 0;
} 

 

posted @ 2018-04-06 20:34  最美遇见你  阅读(344)  评论(0编辑  收藏  举报