zoukankan      html  css  js  c++  java
  • 试题 历届试题 幸运数(模拟)

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

    首先从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
    最近鸽了。明天重新刷题...
    题解:标签写用堆。but,直接暴力模拟可以过,记录幸运数,每次依次筛即可,由规模取一千次。
    #include<bits/stdc++.h>
    using namespace std;
    int maxx=1e6+5;
    int a[1000005];
    int main(){
        int n,m;cin>>m>>n;
        for(int i=1;i<=maxx;i++)a[i]=i;
        int index,c=1000,s=1;
        a[1]=2;///从2开始筛
        while(c--){
            index=1;
            for(int i=2;i<=maxx;i++){
                if(i%a[s]!=0){
                    a[++index]=a[i];
                }
            }
            maxx=index;
            s++;
        }
        a[1]=1;///因为出题者说1是第一个幸运数
        int sum=0;
        for(int i=1;i<=index;i++){
            if(a[i]>=n)break;
            if(a[i]>m&&a[i]<n)sum++;
            ///else break;
        }
        cout<<sum<<endl;
        return 0;
    }

     

  • 相关阅读:
    conda安装使用
    数据库删除后台代码
    表格显示数据库(html和php混编)
    唯一用户名jquery和PHP代码
    //阿贾克斯提交数据库
    //向数据库添加数据(form表单提交)
    //conn数据库配置
    Css 变量
    input标签让光标不出现
    Es6Class
  • 原文地址:https://www.cnblogs.com/mohari/p/13450038.html
Copyright © 2011-2022 走看看