用C语言实现素数筛法获取一亿(100000000)以内的全部素数

具体筛法是:先把n个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。因为希腊人是把数写在涂腊的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛法”,简称“筛法”。

下面是代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4
 5 int main(int argc, char * argv[])
 6 {    //寻找2~num之间的所有素数
 7     if(argc < 2)
 8     {
 9         printf("Usage : %s num\n", argv[0]);
10         return 0;
11     }
12     int iMax = atoi(argv[1]);
13
14     if(iMax < 2)
15     {
16         printf("num is too little, num >=2");
17         return 0;
18     }
19
20     char *p = (char *)malloc(sizeof(char) * iMax + 1);
21     memset(p, sizeof(char) * iMax + 1, 0);
22
23     int i = 0, j = 0, k = 0;
24     for(i = 2; i <= iMax; i++)
25     {
26         for(j = i + i; j <= iMax; j += i)
27         {
28             p[j] = 1;
29         }
30     }
31     FILE * fp = NULL;    //程序执行完成后,文件 prime-number.txt中就是我们需要的素数
32     if((fp = fopen("prime-number.txt", "w")) == NULL)
33     {
34         return 0;
35     }
36     k = 0;
37     int iAll = 0;
38     for(i = 2; i <= iMax; i++)
39     {
40         if(0 == p[i])
41         {
42             iAll ++;
43             k++;
44             // output to file : fp,把这些素数写入文件
45             fprintf(fp, "%6d ", i);
46             if(10 == k)
47             {
48                 fprintf(fp, "\n");
49                 k = 0;
50             }
51             //printf("%d ", i);
52         }
53     }
54     printf("\n");
55     fclose(fp);
56     free(p);
57     printf("all : %d\n", iAll);
58
59     return 0;
60 }

输出结果放在百度网盘 :http://pan.baidu.com/s/1pJv58Wb

作者:风波

mail : [email protected]

时间: 2024-10-10 10:20:35

用C语言实现素数筛法获取一亿(100000000)以内的全部素数的相关文章

素数专题——素数筛法

关于素数的判断,大家最常用的方法估计就是循环判断到sqrt(n)的方法了:(直接上代码) bool isprime(int n) { for(int i=2;i<=sqrt(n);i++) { if(n%i==0) return false; } return true; } 这种素数的判断方法的确直观,但这种算法只对较小数据量适用,当数据量较大时,该方法就不再适用于素数的判定了.因此,我们此处引入一种新的算法——素数筛法. 首先介绍一下什么叫素数筛法: 假设所有待判断的数字的上限是L,声明一个

hdu6069[素数筛法] 2017多校3

/*hdu6069[素数筛法] 2017多校3*/ #include <bits/stdc++.h> using namespace std; typedef long long LL; LL l, r, k; const LL MOD = 998244353LL; int T, n, prime[1100000], primesize; bool isprime[11000000]; void getlist(int listsize) { memset(isprime, 1, sizeof

POJ_3421_X-factor Chains(素数筛法)

X-factor Chains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5659   Accepted: 1786 Description Given a positive integer X, an X-factor chain of length m is a sequence of integers, 1 = X0, X1, X2, -, Xm = X satisfying Xi < Xi+1 and Xi

区间素数筛法

给定整数a和b,请问区间[a,b)内有多少个素数? a<b<=10^12 b-a<=10^6 因为b以内合数的最小质因数一定不超过sqrt(b),如果有sqrt(b)以内的素数表的话,就可以把筛选法用在[a,b)上了,先分别做好[2,sqrt(b))的表和[a,b)的表,然后从[2,sqrt(b))的表中筛得素数的同时,也将其倍数从[a,b)的表中划去,最后剩下的就是区间[a,b)内的素数了. 有的时候需要求出某个特定区间的素数,但是数可能很大,数组也开不小,所以需要进行下标偏移,这样才

HDU 6069 Counting Divisors(区间素数筛法)

题意:...就题面一句话 思路:比赛一看公式,就想到要用到约数个数定理 约数个数定理就是: 对于一个大于1正整数n可以分解质因数: 则n的正约数的个数就是 对于n^k其实就是每个因子的个数乘了一个K 然后现在就变成了求每个数的每个质因子有多少个,但是比赛的时候只想到sqrt(n)的分解方法,总复杂度爆炸,就一直没过去,然后赛后看官方题解感觉好妙啊! 通过类似素数筛法的方式,把L - R的质因子给分解,就可以在O(nlogn)的时间之内把所以的数给筛出来. 代码: /** @xigua */ #i

poj 2478 Farey Sequence(基于素数筛法求欧拉函数)

http://poj.org/problem?id=2478 求欧拉函数的模板. 初涉欧拉函数,先学一学它基本的性质. 1.欧拉函数是求小于n且和n互质(包括1)的正整数的个数.记为φ(n). 2.欧拉定理:若a与n互质,那么有a^φ(n) ≡ 1(mod n),经常用于求幂的模. 3.若p是一个质数,那么φ(p) = p-1,注意φ(1) = 1. 4.欧拉函数是积性函数: 若m与n互质,那么φ(nm) = φ(n) * φ(m). 若n = p^k且p为质数,那么φ(n) = p^k - p

NowCoder猜想(素数筛法+位压缩)

在期末被各科的大作业碾压快要窒息之际,百忙之中抽空上牛客网逛了逛,无意中发现一道好题,NowCoder猜想,题意很明显,就是个简单的素数筛法,但竟然超内存了,我晕(+﹏+)~  明明有 3 万多 k 的空间限制……于是我不打表,试了试最暴力的做法,赤裸裸的做法果然超时了,无奈,只好对素数筛法进行位压缩了,这是我目前所能想到的方法了,第一次用上这样的特技,还是调了好一会(位数组里不能用 bool 来定义,具体的话好像 bool 和 int 之类的整型稍有不同:也不能用 int,因其最高位是正负标志

【POJ3006】Dirichlet&#39;s Theorem on Arithmetic Progressions(素数筛法)

简单的暴力筛法就可. 1 #include <iostream> 2 #include <cstring> 3 #include <cmath> 4 #include <cctype> 5 #include <cstdio> 6 #include <cmath> 7 #include <algorithm> 8 #include <numeric> 9 using namespace std; 10 11 co

HDOJ 6069 素数筛法(数学)

Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 3041    Accepted Submission(s): 1130 Problem Description In mathematics, the function d(n) denotes the number of divisors of