博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法学习笔记1.3.1 素数筛法
阅读量:5155 次
发布时间:2019-06-13

本文共 1598 字,大约阅读时间需要 5 分钟。

任务

给定一个正整数N,求出[2,N]中的所有素数。

说明

数组valid[i]记录i是否为素数。初始所有的valid[i]都为true。从2开始从小到大枚举i,若valid[i]=true,则把从i^2开始的所有i的倍数的valid赋为false。

结束之后valid[i]=true的就是素数。

接口

void getPrime(int n, int &tot, int ans[maxn])

复杂度:O(NlogN),O(N),两种实现

输入:N 所需素数的范围
输出:

  • &tot 引用,素数总数
  • ans 素数表

代码:

#include 
#include
using namespace std;const int maxn = 1010;bool valid[maxn];void getPrime(int n, int &tot, int ans[maxn]) { tot = 0; int i, j; for (i = 2; i <= n; i ++) valid[i] = true; for (i = 2; i <= n; i ++) if (valid[i]) { if (n/i < i) break; for (j = i * i; j <= n; j += i) valid[j] = false; } for (i = 2; i <= n; i ++) if (valid[i]) ans[++tot] = i;}/* 素数筛法 O(N) */void getPrime2(int n, int &tot, int ans[maxn]) { tot = 0; memset(valid, true, sizeof(valid)); for (int i = 2; i <= n; i ++) { if (valid[i]) { ans[++tot] = i; } for (int j = 1; j <= tot && i * ans[j] <= n; j ++) { valid[ i * ans[j] ] = false; if (i % ans[j] == 0) break; } }}int main() { int n = 100, tot, ans[maxn]; cout << "method 1" << endl; getPrime(n, tot, ans); cout << "tot = " << tot << endl; for (int i = 1; i <= tot; i ++) { if (i > 1) cout << ","; cout << ans[i]; } cout << endl; cout << "method 2" << endl; getPrime2(n, tot, ans); cout << "tot = " << tot << endl; for (int i = 1; i <= tot; i ++) { if (i > 1) cout << ","; cout << ans[i]; } cout << endl; return 0;}

使用范例

POJ3177

转载于:https://www.cnblogs.com/zifeiy/p/9526198.html

你可能感兴趣的文章
ISP DSP的不同
查看>>
深入Linux grep指令的详解(实用型)
查看>>
嵌入式根文件系统的移植和制作详解
查看>>
单片机定时器中断原理
查看>>
Ignite 配置更新Oracle JDBC Drive
查看>>
partproble在RHEL 6下无法更新分区信息
查看>>
c网购物车流程图
查看>>
xapth(笔记)
查看>>
HTTP 错误 403.6 - Forbidden 解决方案
查看>>
一个小例子介绍Obj-C的函数命名方式
查看>>
关于Bootstrap的理解
查看>>
hdu 2089 数位dp入门
查看>>
I/O的一些简单操作
查看>>
Handbook之012:函数类别构型
查看>>
php取整函数ceil,floor,round,intval的区别
查看>>
局部富文本
查看>>
例题6-7 树的层次遍历
查看>>
2019-2-15 日记
查看>>
那些年我们跳过的 IE坑
查看>>
产生式模型和判别式模型
查看>>