筛法求1000000以内素数个数---时间复杂度为o(n)

这样做倒是挺简单的,怎么容易怎么做

#include<stdio.h>
#include<string.h>
#define maxn 1000000
int isprime[maxn+10];
int prime[maxn/10];
int count;
int n;
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        count=0;

        for(int i=0;i<=maxn+10;i++)
            isprime[i]=0;

        for(int i=2; i<=n; i++)
        {
            if(isprime[i]==0)
            {
                prime[count++]=i;
                for(int j=i; j<=n; j+=i)
                    isprime[j]=1;
            }
        }
        printf("%d\n",count);
    }
    return 0;
}
时间: 2024-12-18 08:49:48

筛法求1000000以内素数个数---时间复杂度为o(n)的相关文章

POJ 1007 Difference Between Primes(线性筛法求N以内的素数表)

Difference Between Primes Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description All you know Goldbach conjecture.That is to say, Every even integer greater than 2 can be expressed as the sum of two primes. Today, sk

求100以内素数的5中基本方法及其优化

求100以内素数的5中基本方法及其优化方法1 基本做法 错解比较:进入了小循环:有时加pass也可以.错解:这里的print也同样注意不要写到循环内. 注释:1.两种条件运用:为合数.2.以上错误点.方法二 注释:1.条件运用,质数除了2都是奇数,因为偶数都能被除了自身外的2整除.改进自12.偶数除了2都不是质数.3.第二个for写的是到开方的奇数.4.奇数含有质数和非质数.偶数除了2一定不是质数.所以先剥离了偶数. 方法三:使用列表 注释:1.break continue pass2.质数i依

关于求N以内素数的python实现以及优化方法

大纲: 摘要 一.素数的定义 二.N以内素数常用实现方法 三.优化方法 原理层面 代码层面 range和xrange while 1和while True真的重要吗 摘要 本文主要是参考<编程珠玑-续订版>第一章关于求素数的解释,描述素数的定义,以及N以内素数的常用求解方法,最后一步步给出优化方法.代码用python实现两个优化方法,并给出原理层面和代码层面的分析.其中比较有意思的是,最后的部分,最开始代码写的只是考虑功能实现,而没有考虑怎样优化,最后的结果却大跌眼镜.反思之后,发现代码中的问

Java简单算法--求100以内素数

package cn.magicdu.algorithm; /** * 打印素数 * * @author xiaoduc * */ public class Prim { public static void main(String[] args) { for(int i=1;i<=100;i++){ if(isPrime(i)){ System.out.println(i); } } } /** * 判断是否是素数 * @param num * @return */ private stati

筛法求10000以内的质数

#include<stdio.h>#define N 10000int main(){ int i,j,a[N]; for(i=2;i<N;i++) a[i]=1; for(i=2;i<N;i++) if(a[i]) for(j=i;i*j<N;j++) a[i*j]=0; for(i=2;i<N;i++) if(a[i]) printf("%d\t",i); return 0;}

埃氏筛法(快速筛选n以内素数的个数)

给你一个数n,请问n以内有多少个素数?(n <= 10e7) 一般来说,要是对一个整数进行素数判断,首先想到的是写个函数判断是否为素数,然后调用这个函数,时间复杂度为O(n^(½)),但是要求n以内的素数就略显吃力了. 要是求n以内的素数个数的话,可以用埃式筛选.预处理一下. 先看下面的代码: 1 /* 2 |埃式筛法| 3 |快速筛选素数| |15-7-26| 4 */ 5 #include <iostream> 6 #include <cstdio> 7 using na

欧拉筛法求素数个数

判断a是否为素数,求1——n的素数个数 考虑欧拉筛法———— http://wenku.baidu.com/link?url=dFs00TAw8_k46aeSbXy5nB5LVqJ51uUJgY9zVWEDQdwjLN-qLFWZuYcGPE5EDcztNQAMtKfUbSseBvfBzV4fcQvlneOVHJJQvgJjcGC1iN7 //判断是否为素数:计算1到n的素数个数 #include<iostream> #include<cstring> #define MAX 10

埃氏筛法(求n以内有多少个素数)

题目大意:给定整数n,请问n以内有多少个素数 思路:想必要判断一个数是否是素数,大家都会了,并且可以在O(根号n)的复杂度求出答案,那么求n以内的素数呢,那样求就显得有点复杂了,下面看一下这里介绍的??氏算法 其实呢,就是求出第一个素数,然后把n以内它的倍数都删掉就行了,很简单.然后找下一个素数,同样方法····· 看代码 #include<iostream> #include<string.h> #include<map> #include<cstdio>

Java 求1-100以内的所有素数,判断一个数是不是素数

质数(prime number)又称素数,有无限个. 质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数. 小师弟问了我个这么个联系题,虽然看似简单,但是,大家都觉得简单的东西,没必要分享的话,那初学者,不是很痛苦吗? 所以,我就给小师弟示范了一下.方便初学者,看看怎么写代码. 代码内部的细节(都是针对没开始工作,或者刚刚工作的哥们): 1,模块化思想. 先拆分需求,本来让你求1-100以内的素数,你不能上来就干,先拆分先考虑怎么确定一个数是不是素数,然后再复用到所有.