怎么判断一个数是素数?

常规的方法是枚举从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. 用Maven创建SpringMVC项目

    IDE:Eclipse Jee JDK:8 Tomcat:8 1.创建项目 File->New->Maven Project-> ->Next-> ->Next-& ...

  2. webgoat 7.1 实战指南

    WSASP中文文档参考链接: http://www.owasp.org.cn/owasp-project/2017-owasp-top-10 OWASP Top 10 2017中文版V1.3http: ...

  3. Thinkphp5图片上传正常,音频和视频上传失败的原因及解决

    Thinkphp5图片上传正常,音频和视频上传失败的原因及解决 一.总结 一句话总结:php中默认限制了上传文件的大小为2M,查找错误的时候百度,且根据错误提示来查找错误. 我的实际问题是: 我的表单 ...

  4. ocdefirst安装更新数据库

    数据迁移(Migrations) 启用数据迁移在控制台中输入如下命令:Enable-Migrations 这时会在项目目录中增加一个Migrations文件夹,里面放置了两个文件:EF会通过C#代码的 ...

  5. axel---下载工具

    axel是Linux下一个不错的HTTP/ftp高速下载工具.支持多线程下载.断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件.适合网速不给力时多线程下载提高下载速度.比如在国内VP ...

  6. excel的隔行插入

    https://wenda.so.com/q/1523455238213064 #公式 IF(ISODD(ROW()),OFFSET($B$1,INT((ROW(A1)-1)/2),),OFFSET( ...

  7. Java中的继承和接口

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 这是个老话题,继承和接口是实现多态的两种方式,如果对象很多,其中一对一对的有共同点,建议用继承,如果 ...

  8. SpringJunit测试类 BaseTest(转)

    /** * * * @author Jerval * @date 2011-2-17 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfig ...

  9. NYOJ 927 The partial sum problem 【DFS】+【剪枝】

    The partial sum problem 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 One day,Tom's girlfriend give him a ...

  10. battery-获取手机电量信息

    我们如果想要获得手机的电池电量信息,可以借助广播来实现.因为当手机电池电量发生变化的时候,系统会发送一个广播.具体代码如下 //注册 intentFilter.addAction(Intent.ACT ...