• 蓝桥杯  历届试题 幸运数  dfs


      历届试题 幸运数  

    时间限制:1.0s   内存限制:256.0MB

          

    问题描述

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

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

    1 20

    样例输出1

    5

    样例输入2

    30 69

    样例输出2

    8

    题解:每找到一个幸运数遍历后面的数,将下标不能整除的数按顺序重新赋值到数组中(dfs实现幸运数字下标的遍历)

    #include<iostream>
    using namespace std;
    int p[1000011],n;
    void dfs(int b){
            int num=b+1;
            if(p[b]>=n)
                    return ;
            for(int i=b+1;i<n;i++)
                    if(i%p[b])//第b个后重新赋值
                    //注意是判断序号位置能否被p[b]整除
                            p[num++]=p[i];
            dfs(b+1);//下一个幸运数的下标
    }
    int main()
    {
            int m;
            while(~scanf("%d%d",&m,&n)){
                    p[1]=1;
                    for(int i=1;i<=n;i++)
                            p[i]=2*i-1;
                    dfs(2);
                    int ans=0;
                    for(int i=1;p[i]<n;i++){//cout<<p[i]<<endl;
                            if(p[i]>m)
                                    ans++;
                            }
                    printf("%d
    ",ans);
            }
            return 0;
    }
    
  • 相关阅读:
    Tor网络突破IP封锁,爬虫好搭档【入门手册】
    ubuntu python3相关
    toutiao url
    处理跨域请求
    Python使用虚拟环境
    Python删除文件,空文件夹,非空文件夹
    如何在jupyter中使用Python2和Python3
    推荐使用国内的豆瓣源安装Python插件
    Python数据库查询之组合条件查询-F&Q查询
    获取Django项目的全部url
  • 原文地址:https://www.cnblogs.com/aeipyuan/p/10459907.html
Copyright © 2020-2023  润新知