zoukankan      html  css  js  c++  java
  • Eratosthense筛法

    介绍一下Eratosthense筛法(这里是素数表的打法)

    对于不超过n的每个非负数P删除2*p,3*p.....,当处理完所有的剩下的就是素数了,
    优化方案之一是判重,二是开平方和平方。
    首先解释为什么要平方,因为假设i是大于2的,那么i之前的2i,3i,4i什么的都已经被2倍3倍的筛掉了,所以要平方,
    再来解释为什么开方就简单了,都i*i做起始了,不开方后边的也是浪费。

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #define INF 1000000
    int vis[1234567];
    int  main()
    {
        memset(vis,0,sizeof(vis));
        int h=sqrt(INF+0.5);
        for(int i=2;i<=h;i++){
            if(!vis[i]){
                for(int j=i*i;j<=INF;j+=i)
                vis[j]=1;
            }
        }
        int n,m;
        while(~scanf("%d%d",&n,&m)){
            int step=0;
            for(int i=n;i<=m;i++)
            if(!vis[i])
            step++;
            printf("%d
    ",step);
        }
    }
    

     我觉得这是一种思想可以用在其他的优化上,引用空间来缩短时间,还有就是开平方和平方的处理 。

  • 相关阅读:
    快速排序
    优先队列
    堆排序
    树、二叉树基础
    分治法
    递归算法详细分析
    算法基础
    Linux文件系统详解
    fs/ext2/inode.c相关函数注释
    块设备的读流程分析
  • 原文地址:https://www.cnblogs.com/VectorLin/p/5239776.html
Copyright © 2011-2022 走看看