一、埃拉托斯特尼筛法

  名字很高大上,然而并没有什么卵用……

思路:

  在把<=√n的质数所有的<=n的倍数剔除,剩下的就都是质数了,很容易理解……

  复杂度O(nloglogn)

 #include<cmath>
const int MAXN=;
int b[MAXN/],top;
bool a[MAXN];
void cal_prime_num(int n)
{
k=sqrt(n);
for(int i=;i<k;i++)
{
if(!a[i])
{
int j=;
b[++top]=i;
while(i*j<n)
{
a[i*j]=true;
++j;
}
}
}
}

二、欧拉筛

  上一个筛法似乎复杂度不大,但是遇到107规模的数据就会炸,主要是因为一个数会被不同的质数筛好几遍,欧拉筛保证一个合数只被它的最小质因子筛去一遍,这就是整个代码最核心的部分,也是难理解的部分,然而只有一句话:

if(!i%pri[j])break;

  证明转自他人博客:

prime数组中的素数是递增的,当 i 能整除 primej,那么 i*primej+1这个合数肯定被primej乘以某个数筛掉。
因为i中含有primej,primej比primej+1小。接下去的素数同理。所以不用筛下去了。
在满足i%prmej==0这个条件之前以及第一次满足改条件时,primej必定是primej*i的最小因子。

  复杂度O(n)

  其余的代码就很容易理解了:

 #include<cmath>
const int MAXN=;
int b[MAXN/],top;
bool ispri[MAXN];
void cal_prime_num(int n)
{
for(int i=;i<=n;++i)
{
if(!ispri[i])pri[++top]=i;
for(int j=;j<=top&&i*pri[j]<=n;++j)
{
ispri[i*pri[j]]=true;
if(!i%pri[j])break;
}
}
}

数论-求n以内的质数的更多相关文章

  1. 求1000以内的质数c语言

    之前在做求1000以内的质数的时候,我们一般能想到的就是从3~(根号)no,逐一和no除,如果存在某个i使得  i|no成立的话,说明no不是质数(“i|no”是i整除除no的意思): 在<明解 ...

  2. 求n以内的质数(质数的定义:在大于1的自然数中,除了1和它本身意外,无法被其他自然数整除的数)

    思路: 1.(质数筛选定理)n不能够被不大于根号n的任何质数整除,则n是一个质数2.除了2的偶数都不是质数代码如下: /** * 求n内的质数 * @param int $n * @return ar ...

  3. 编程&blog处女篇-用C#求100以内的质数

    using System;namespace Loops{ class Program { static void Main(string[] args) { /*局部变量定义*/ int i, j; ...

  4. erlang 求N以内的质数

    素数,又称质数,在一个大于1的自然数中,除了1和此整数自身之外,不能被其他自然数整除的数. 比1大但不是素数的数称为合数. 1和0既不是素数,也不是合数. 算术基本定理证明每个大于1的正整数都可以写成 ...

  5. Java实现 基础算法 求100以内的质数

    public class 求质数 { public static void main(String[] args) { for (int i = 2; i < 100; i++) { int t ...

  6. 求n以内的质数的数量

  7. python-找出100以内的质数

    质数:就是只能被1和本身整除的数,1除外,如2,3,5,7,11,13等等 ##求一百以内的质数(1和本身除尽的数)if __name__ == '__main__': list=[] flag=Fa ...

  8. while做法1.兔子生兔子 2.求100以内质数的和3.洗发水15元 牙膏5元 香皂2元 150元的算法

    1.兔子生兔子 2.求100以内质数的和 3.150块钱花完问题

  9. while:1.兔子生兔子问题 2.打印菱形 3.求100以内质数的和4.洗发水15元一瓶,牙膏5元一支,香皂2元一块,150元刚好花完

    1.兔子生兔子问题: 2.打印菱形 3.求100以内质数的和 4.洗发水15元一瓶,牙膏5元一支,香皂2元一块,150元刚好花完有多少种情况?

随机推荐

  1. ZJOI 2018 一试记

    ZJOI一试几天,天微冷,雨.倒是考试当天近午时分出了太阳. 开题前的一刻,心情反而平静了,窗外泛着淡金色的日光照进来,仿佛今天的我并不是所谓来冲击省队,而只是来经历一场洗礼. 开题了,虽然有一点小插 ...

  2. BGP的那些安全痛点(转)

    0x00 BGP(RFC 1771. RFC 4271)定义 全称是Border Gateway Protocol, 对应中文是边界网关协议,最新版本是BGPv4. BGP是互联网上一个核心的互联网去 ...

  3. 设计模式 (一)——策略模式(Strategy,行为型)

    1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.策略模式(Strategy Pattern)属于行为型模式,其做法是将类所需的行为或者算法一个个封装成单独的类,并将其作为类的数据成员 ...

  4. ACM比赛_注意

    ACM比赛_注意: 比赛前: 1.前一天早一点睡觉 2.避免参加激烈的活动,以免比赛时精力不足; 3.少喝水,并提前上厕所; 4.把账号,密码都准备好,放在txt中 5.提前创建多个程序(etc.10 ...

  5. UVAL 7902 2016ECfinal F - Mr. Panda and Fantastic Beasts

    题意: 给出n个串,求一个最短的第一个串的子串使它不在其他的n-1个串中出现,若有多个求字典序最小的. Limits: • 1 ≤ T ≤ 42. • 2 ≤ N ≤ 50000. • N ≤ S1 ...

  6. C# list.ForEach用法

    list.ForEach(delegate(T model) { ... });

  7. npm 5.4.2 更新后就不能用了

    今天刚,npm run dev 就出现更新提示,没多想就更了, 更新用了49S,下来npm 的所以命令包一个semer的插件 ... 最后下载新node 8.5覆盖安装, 就解决了, node 8.5 ...

  8. 关于connect by 误区讲解,纯属个人心得和经验,有图有文字

    本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处. http://www.cnblogs.com/king-xg/p/6927541.html 如果觉得对您有帮 ...

  9. 在VMware安装Ubuntu后一直停留在VMware Easy Install

    在VMware安装Ubuntu完成后,一直停留在VMware Easy Install,可以登录但是没有窗口界面,如图: 在此登录后依次运行以下命令: sudo mv /etc/issue.backu ...

  10. codevs 1070 普通递归关系

    1070 普通递归关系  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master     题目描述 Description 考虑以下定义在非负整数n上的递归关系 f( ...