怎么判断一个数是素数?

常规的方法是枚举从2开始的数,看看是否能被整除。

但是,如果要判断的数很多的时候,那么效率会十分低下.。。。

一个优化的方法是不用判断比这个数小的所有数(到平方根位置),而是判断比他小的所有素数。

如果所有小于他的素数都不能将其整除,那么他就是素数。

那么如何快速得到小于他的素数?

有个Eratosthenes

把最后决定采用的写法放开头。。不是素数的标记为1

for(int i=2;i*i<=1000000;i++)
{
if(!isprime[i])
for(int j=i;j*i<=1000000;j++)
isprime[i*j]=1;
}

根据刘汝佳的书的代码如下:

可是当n为100万时候竟然直接停止工作!

#include<iostream>
using namespace std;
const int MAXN=1000+10;
int main()
{
int n;
cin>>n;
int vis[MAXN],primer[MAXN],count=0;
memset(vis,0,sizeof(vis));
for(int i=2;i<=n;i++)
{
if(!vis[i])
primer[count++]=i; //将素数存入
for(int j=i*i;j<=n;j+=i) //标记是否是素数,如果不存入的话,直接判断vis[target]是否为0也可以。
vis[j]=1;
}
for(int i=0;i<count;i++)
cout<<primer[i]<<" ";
cout<<count<<endl;
}

判断一个数是否是两个素数的乘积。

多组数据不超过1000组,每组数据一行一个整数n(2
=< n <=1000000)。

n是否是两个素数的乘积,是输出Yes,不是输出No。

下面的写法是非素数标记为1

听队友的改进如下:

#include<cstdio>
const int MAXN=1000000+10;
bool vis[MAXN]={0}; int main()
{
int count=0;
for(int i=2;i*i<=1000000;i++)
{
for(int j=i;j*i<=1000000;j++)
vis[i*j]=1;
} int n;
while(~scanf("%d",&n))
{
bool ok=false;
for(int i=2;i * i <=n;i+=1)
{
if(vis[i]) continue;
int t=n / i;
if(t*i==n && !vis[t] )
{
ok=true;
break;
}
}
if(ok)
printf("Yes\n");
else
printf("No\n");
}
}

FZU1563

http://acm.fzu.edu.cn/problem.php?pid=1563

可是在FZU这题直接TLE!搜题解得到如下写法

#include<cstdio>
const int MAXN=1000000+10;
const int INF=1000000;
bool isprime[MAXN]={0};
int prime[MAXN];
int main()
{
int pnum=0;
for(int i=2;i<=INF;i++)
{
if(!isprime[i]) prime[pnum++]=i;
for(int j=0;j<pnum&&prime[j]*i<=INF;j++)
{
isprime[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
int n; scanf("%d",&n);
while(n--)
{
int a,b;
int cnt=0;
scanf("%d%d",&a,&b);
for(int i=a;i<=b;i++)
if(isprime[i]==0)
cnt++;
printf("%d\n",cnt);
}
}

最后改进如下:

#include<cstdio>
const int MAXN=1000000+10;
const int INF=1000000;
bool isprime[MAXN]={0};
int prime[MAXN];
int main()
{ for(int i=2;i*i<=1000000;i++)
{
if(!isprime[i])
for(int j=i;j*i<=1000000;j++)
isprime[i*j]=1;
}
int n; scanf("%d",&n);
while(n--)
{
int a,b;
int cnt=0;
scanf("%d%d",&a,&b);
for(int i=a;i<=b;i++)
if(isprime[i]==0)
cnt++;
printf("%d\n",cnt);
}
}

素数表(Eratosthenes)的更多相关文章

  1. poj 2262【素数表的应用---判断素数】【哈希】

    Goldbach's Conjecture Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 35214   Accepted: ...

  2. hdu 5407 CRB and Candies(组合数+最小公倍数+素数表+逆元)2015 Multi-University Training Contest 10

    题意: 输入n,求c(n,0)到c(n,n)的所有组合数的最小公倍数. 输入: 首行输入整数t,表示共有t组测试样例. 每组测试样例包含一个正整数n(1<=n<=1e6). 输出: 输出结 ...

  3. 埃氏筛法求素数&构造素数表求素数

    埃氏筛法求素数和构造素数表求素数是一个道理. 首先,列出从2开始的所有自然数,构造一个序列: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1 ...

  4. <编程>比较两种素数表生成算法+计算程序运行时间+通过CMD重定向测试程序

    最近学习加密算法,需要生成素数表,一开始使用简单的循环,从2开始判断.代码如下: #include<iostream> #include<cstdio> #include< ...

  5. UVA10006 - Carmichael Numbers(筛选构造素数表+高速幂)

    UVA10006 - Carmichael Numbers(筛选构造素数表+高速幂) 题目链接 题目大意:假设有一个合数.然后它满足随意大于1小于n的整数a, 满足a^n%n = a;这种合数叫做Ca ...

  6. PAT Advanced 1059 Prime Factors (25) [素数表的建⽴]

    题目 Given any positive integer N, you are supposed to find all of its prime factors, and write them i ...

  7. 素数筛 : Eratosthenes 筛法, 线性筛法

    这是两种简单的素数筛法, 好不容易理解了以后写篇博客加深下记忆 首先, 这两种算法用于解决的问题是 : 求小于n的所有素数 ( 个数 ) 比如 这道题 在不了解这两个素数筛算法的同学, 可能会这么写一 ...

  8. BZOJ_1025_[SHOI2009]_游戏_(素数表+最小公倍数+DP)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1025 分析 对于\(n\),转一圈回来之后其实是好几个环各转了整数圈.这些环中的数为\(1,2 ...

  9. [Swust OJ 1125]--又见GCD(数论,素数表存贮因子)

    题目链接:http://acm.swust.edu.cn/problem/1125/ Time limit(ms): 1000 Memory limit(kb): 65535   Descriptio ...

  10. 埃氏素数筛法(Eratosthenes)

    埃氏筛法: 对于每一个小于n的非负整数p,删去2p,3p,4p......,当处理完所有数后,还没有删除的就是素数. 想法:用a记录素数表,a[i]=1表示不是素数,a[i]=0表示是素数. #inc ...

随机推荐

  1. hdu 5073 Galaxy(2014 鞍山现场赛)

    Galaxy                                                                   Time Limit: 2000/1000 MS (J ...

  2. 具体解释window.location

    window.location 对象所包括的属性 hash//从井号 (#) 開始的 URL(锚) host//主机名和当前 URL 的port号 hostname//当前 URL 的主机名 href ...

  3. 类数组对象arguments 和 数组对象

    arguments并不是一个真正的数组,而是一个“类似数组(array-like)”的对象: 就像下面的这段输出,就是典型的类数组对象: {0:12, 1:23} 一.类数组 VS 数组 相同点: 都 ...

  4. POJ 3168 排序+扫描

    题意: 思路: 我们可以把每个矩形拆成四条线 与x轴平行的放在一起 与y轴平行的放在一起 排个序 判一判有没有交 有交 则说明不可扩张 统计一下 就可以了 处理的姿势很重要 姿势不对毁一生 //By ...

  5. DG 参数详解

    1.与角色无关的参数 ◆ DB_UNIQUE_NAME:数据库唯一名.对于物理standby,DB_NAME必须相同,对于逻辑standby,DB_NAME可以不同,所以在10g中引入DB_UNIQU ...

  6. 洛谷 P2392 kkksc03考前临时抱佛脚

    P2392 kkksc03考前临时抱佛脚 题目背景 kkksc03的大学生活非常的颓废,平时根本不学习.但是,临近期末考试,他必须要开始抱佛脚,以求不挂科. 题目描述 这次期末考试,kkksc03需要 ...

  7. scroll- 滑动条风格调整

    <item name="scrollbarFadeDuration">250</item> <item name="scrollbarDef ...

  8. 24.Node.js Stream(流)

    转自:http://www.runoob.com/nodejs/nodejs-stream.html Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请 ...

  9. jodd-cache集锦

    Jodd cache提供了一组cache的实现,其层次如下: 其中, AbstractCacheMap是一个具有计时和大小的缓存map的默认实现,它的实现类必须: 创建一个新的缓存map. 实现自己的 ...

  10. 使用STS新的工作空间无需再配置

    在你的新的工作空间中找到比如 F:\java-wokespace\你的新的工作空间名称\.metadata\.plugins\org.eclipse.core.runtime\.settings 找到 ...