• 半质数的个数 csdn 英雄会 高校俱乐部


     2·14 情人&元宵节专题:半质数的个数。

    题目质数是大家熟知的概念,我们定义一个半质数的概念:如果一个数恰好是两个质数的乘积(可以相同),则称它为半质数。前几个半质数是 4, 6, 9, 10, 14, 15, 21, 22, 25, 26。我们的问题是,输入两个正整数x<=y,问[x,y]之间有多少个半质数? 输入:x,y 输出:[x,y]之间有多少个半质数。 输入数据范围 1<=x<=y<=2000000。 祝所有挑战的Heros 2014年情人节、元宵节快乐。 


    解释:这是一道简单的题目,思路就是打表吧。没多困难。(我怎么发现我写的问题都几乎是当成水题来做的?)

               众所周知,求逆的问题相对来说都是比较困难,比如分解问题,矩阵求逆等等。既然范围已出且在可接受范围,那            么还多虑什么?

    步骤: 1.打素数表

                2.打半质数表

                ……

    代码:

    /*******************************************************************************/
    /* OS           : 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 UTC 2013 GNU/Linux
     * Compiler     : g++ (GCC)  4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
     * Encoding     : UTF8
     * Date         : 
     * All Rights Reserved by yaolong.
     *****************************************************************************/
    /* Description: ***************************************************************
     *****************************************************************************/
    /* Analysis: ******************************************************************
     *****************************************************************************/
    /*****************************************************************************/
    //*
    
    #include <stdio.h>
    #include <iostream>
    #include <string>
    #include <cstring>
    using namespace std;
    
    #define N 2000000
    
    bool prime[N];
    bool dp[3*N];
    int first=1;
    void fun1()
    {
        memset(prime,1,sizeof(prime));
        memset(dp,0,sizeof(dp));
        int i;
    //从2开始筛选
        for(i=2; i*i<N; i++)
            if(prime[i])
                /*确定没被筛选过的,道理很简单:若x|y,y|z,则有x|z.(y被x筛选过,那么y能筛选的数都被x筛选了)可一定程度上避免多余的筛选*/
                for(int j=2*i; j<N; j+=i)
                    prime[j]=false;
    
    }
    
    void fun2()
    {
        int i,j;
        for(i=2; i<N; i++)
        {
            int tmp=(2*N)/i;
            for(j=i; j<=N; j++)
            {
                if(j>tmp)
                    break;
                if(prime[i]&&prime[j])
                {
                    dp[i*j]=true;
                   
                }
            }
     
        }
     
    }
    int fun3(int x,int y)
    {
        int res=0;
        for(int i=x; i<=y; i++)
        {
            //cout<<dp[i];
            if(dp[i])
            {
                res++;
            }
     
        }
        return res;
     
    }
     
    class Test
    {
    public:
        static int howmany (int   x,int   y)
        {
            if(first==1)
            {
                first=0;
                fun1();
                fun2();
            }
            return fun3(x,y);
        }
    };
    //start 提示:自动阅卷起始唯一标识,请勿删除或增加。
    int main()
    {
        cout<<Test::howmany(60,1000000)<<endl;
    }
    //end //提示:自动阅卷结束唯一标识,请勿删除或增加。
     


  • 相关阅读:
    Arduino IDE for ESP8266 项目云盒子 (1)AP直接模式
    Arduino IDE for ESP8266 项目云盒子(2)一键自配置+网页服务器
    Arduino IDE for ESP8266 项目(4)HTTP客户端+服务端
    远程桌面访问linux
    Arduino IDE for ESP8266 项目(3)创建AP+STA
    Arduino IDE for ESP8266 项目(2)wifi扫描
    Arduino IDE for ESP8266 项目(1) 点亮灯+按键LED+pwm
    双目SLAM(2) opencv
    双目SLAM(1) 总配置
    ORB-SLAM2(4) 离线双目数据测试
  • 原文地址:https://www.cnblogs.com/dengyaolong/p/3697249.html
Copyright © 2020-2023  润新知