• bjtuOJ 1188 素数筛选


    1.素数筛选。利用了每个合数必有一个最小素因子:

    a.把2~n所有数依次存储在一个数组当中

    b.从2开始判断一个数是否为素数,紧接着删除这个素数的所有倍数,那么剩下的数里边,最小的数就是素数。

    c.在程序中有一点最为关键,以下是从一个blog中贴过来的:

    if(i%pr[j]==0)break;
    //pr数组中的素数是递增的,当i能整除pr[j],那么i*pr[j+1]这个合数肯定被pr[j]乘以某个数筛掉。
    //因为i中含有pr[j],pr[j]比pr[j+1]小。接下去的素数同理。所以不用筛下去了。
    //在满足i%pr[j]==0这个条件之前以及第一次满足改条件时,pr[j]必定是pr[j]*i的最小因子。
    2.注意题目中是小于等于n的素数的个数。

    以下是程序代码

    #include <stdio.h>
    #include <string.h>
    
    bool notp[10000000];//素数判定
    
    int pr[10000000],pn,ans;//pr存放素数,pn当前素数个数。
    
    void getprime( int n )
    {
        pn=0;
        memset( notp,0,sizeof(notp) );
        for( int i = 2; i <= n; i++ )
        {
            if(!notp[i])
                pr[pn++]=i;
            for(int j = 0;j < pn && pr[j]*i <= n; j++)
            {
                notp[pr[j] * i]=1;
                if(i % pr[j] == 0)break;
            }
        }
    }
    
    
    int main()
    {
        int n;
        while( scanf("%d",&n) != EOF )
        {
            getprime(n);
            printf("%d\n",pn);
        }
        return 0;
    }
    




  • 相关阅读:
    Eclipse 安装Activiti插件(BPMN打开工具)
    POI Excel 单元格内容类型判断并取值
    AJAX获取数据成功后的返回数据如何声明成全局变量
    java 思维导图
    java excel Workbook API
    金额 保留两位小数
    mybatis教程3(映射文件)
    mybatis教程1(基本使用)
    mybatis教程之原理剖析
    Maven教程4(私服-nexus)
  • 原文地址:https://www.cnblogs.com/dollarzhaole/p/3188945.html
Copyright © 2020-2023  润新知