素数筛选法

筛选法(埃拉托色尼(Eratosthenes)筛法)求素数,例如1~100

思想:逐个筛选,直到int(sqrt(100))个

1)因为1不是质数,将1筛去

2)2是质数,将2的倍数全都挖掉

3)3是质数,将3的倍数全都挖掉

4)4已经被挖去,不进行与4相关的操作

5)5是质数,将5的倍数全都挖掉

6)这个过程一直进行到后面的数全都挖掉为止

不是从1开始:如10~18----一个一个筛--->18

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
//#include <string.h>
int isprime(int n)
{
    int i;
    if(n == 1)
        return 0;
    for(i=2;i<(int)sqrt(n);i++)
        if(n%i == 0)
            return 0;
    return 1;
}
int main()
{
    int n,i,j;
    scanf("%d",&n);
    int *num = (int*)malloc(sizeof(int)*(n+1));
    //memset(num,0,n+1);//不能将动态开辟的数组数都初始化为0
    for(i=1;i<=n;i++)
        num[i] = 0;
    //挖数
    num[1] = 1;
    for(i=2;i<=(int)sqrt(n);i++)
    {
        if(!num[i])
        {
            if(isprime(i))
            {
                for(j=2*i;j<=n;j++)    //挖掉质数的倍数的数
                    if(j%i == 0)
                        num[j] = 1;
            }
        }
    }
    for(i=1;i<=n;i++)
        if(!num[i])
            printf("%d ",i);
    printf("\n");
    return 0;
}
时间: 2024-12-29 23:31:44

素数筛选法的相关文章

hdu 5407 CRB and Candies(素数筛选法,除法取模(乘法逆元))

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5407 解题思路: 官方题解: The problem is just to calculate g(N) =\ LCM(C(N,0), C(N,1), ..., C(N, N))g(N) = LCM(C(N,0),C(N,1),...,C(N,N)). Introducing function f(n) =\ LCM(1, 2, ..., n)f(n) = LCM(1,2,...,n), the

HDU 2161 Primes (素数筛选法)

题意:输入一个数判断是不是素数,并规定2不是素数. 析:一看就很简单吧,用素数筛选法,注意的是结束条件是n<0,一开始被坑了... 不说了,直接上代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; typedef long long LL; const int maxn = 16000 + 10; int p

关于素数的快速查找——素数筛选法

利用素数筛选法进行素数的快速查找.原理很简单,素数一定是奇数,素数的倍数一定不是素数.思路如下: 预定义N表示10000,即表示查找10000以内的素数,首先定义数组prime[]对N以内的数进行标记,奇数存为1,偶数存为0,最终实现结果为素数的prime值为1,因此将prime[2]赋值为1(2是素数).之后利用for循环,对N以内的奇数进行遍历(注意for循环的条件控制),for里用if判断是否为素数(奇数),若是,执行内部嵌套的for循环判断该奇数是否为素数,若是则标记为1,若不是则pri

HDU 1164 Eddy&#39;s research I【素数筛选法】

思路:将输入的这个数分成n个素数的相乘的结果,用一个数组存储起来.之后再输出就可以了 Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6633    Accepted Submission(s): 3971 Problem Description Eddy's interest is very ext

POJ 2689 Prime Distance 素数筛选法应用

题目来源:POJ 2689 Prime Distance 题意:给出一个区间L R 区间内的距离最远和最近的2个素数 并且是相邻的 R-L <= 1000000 但是L和R会很大 思路:一般素数筛选法是拿一个素数 然后它的2倍3倍4倍...都不是 然后这题可以直接从2的L/2倍开始它的L/2+1倍L/2+2倍...都不是素数 首先筛选出一些素数 然后在以这些素数为基础 在L-R上在筛一次因为 R-L <= 1000000 可以左移开一个1百万的数组 #include <cstdio>

POJ 3978 Primes(素数筛选法)

题目 简单的计算A,B之间有多少个素数 只是测试数据有是负的 //AC //A和B之间有多少个素数 //数据可能有负的!!! #include<string.h> #include<stdio.h> //素数筛选法 int pri[100000+10];//1 合数, 0 素数 void Prime() { memset(pri,0,sizeof(pri)); pri[1]=pri[0]=1; for(int i=2;i<50002;i++) { if(pri[i]==0)

POJ 2262 Goldbach&#39;s Conjecture(素数筛选法)

Description In 1742, Christian Goldbach, a German amateur mathematician, sent a letter to Leonhard Euler in which he made the following conjecture: Every even number greater than 4 can be written as the sum of two odd prime numbers. For example: 8 =

ZZUOJ-1222- 属于ACMer的游戏 猜素数 (某月赛,总结一下素数筛选法)

题目位置:1222: 属于ACMer的游戏 猜素数 1222: 属于ACMer的游戏 猜素数 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 88  Solved: 21 [Submit][Status][Web Board] Description ACM实验室的众大神们喜欢聚餐大家一起HAPPY 尤其卢学长喜欢请大家HAPPY,但是卢学长请吃饭有一个习惯,大家要一起玩一个热身游戏,猜素数. 游戏规则如下: 正常人的版本是这样:比如卢学长先约定一

暑期学习日记——超快的素数筛选法(改进)

素数筛选法: 最近发现了一个用bool数组去判断素数的方法,很强大,速度非常之快,方法是从大佬博客:https://www.cnblogs.com/wpnan/p/4073852.html 截下来的,可以看去看一下. 素数筛法是这样的: 1.开一个大的bool型数组prime[],大小就是n+1就可以了.先把所有的下标为奇数的标为true,下标为偶数的标为false. 2.然后: for( i=3; i<=sqrt(n); i+=2 ) { if(prime) for( j=i+i; j<=n