zoukankan      html  css  js  c++  java
  • [蓝桥杯][历届试题]幸运数

    时间限制: 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;
    } 
  • 相关阅读:
    noip2010 乌龟棋
    noip2010 机器翻译
    noip2009 靶形数独
    noip2009 最优贸易
    noip2009 Hankson的趣味题
    noip2009 潜伏者
    noi2010 能量采集
    八大排序算法(六) 快速排序
    八大排序算法(六) 快速排序
    Lesson 12 Nehe
  • 原文地址:https://www.cnblogs.com/zuimeiyujianni/p/8728789.html
Copyright © 2011-2022 走看看