怎么判断一个数是素数?

常规的方法是枚举从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. FZU 1096 QS Network

    QS Network Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on FZU. Original ID: ...

  2. UVA 12508 - Triangles in the Grid(计数问题)

    12508 - Triangles in the Grid 题目链接 题意:给定一个n∗m格子的矩阵,然后给定A,B.问能找到几个面积在A到B之间的三角形. 思路:枚举每一个子矩阵,然后求[0,A]的 ...

  3. poj1328Radar Installation 贪心

    Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 64472   Accepted: 14 ...

  4. VS书签的应用

    为某一行添加书签,方便快速定位. 添加书签, 查找上一个书签, 查找下一个书签, 清空所有书签. 有意思.

  5. .net运行项目的几种形式

    1.通过配置IIS 2.通过VS运行项目 3.发布到测试服务器 不同于PHP的发布,直接把相关的类文件传入ftp即可. .net的发布是编译好dll文件,将dll文件传入即可. 比如改了某个文件,就把 ...

  6. 完整性检查工具Nabou

    完整性检查工具Nabou 650) this.width=650;" onclick="window.open("http://blog.51cto.com/viewpi ...

  7. javafx DragDropped file

    public class EffectTest extends Application { @Override public void start(Stage primaryStage) { Grou ...

  8. DG archive gap

    什么是archive gap Archive Gap就是standby端日志应用的过程中丢失的一段范围的redo.典型的发生在standby端不能接收primary的redo信息或者接收后不能应用这些 ...

  9. ipcalcIP地址计算

    ipcalc命令是一个简单的ip地址计算器,可以完成简单的IP地址计算任务. 语法 ipcalc(选项) 选项 -b:由给定的IP地址和网络掩码计算出广播地址: -h:显示给定UP地址所对应的主机名: ...

  10. SpringMVC框架中的异常解析器-ExceptionHandler和HandlerExceptionResolver

    SpringMVC框架中,处理异常还是挺方便的,提供了一个异常解析器. 处理局部异常 @Controller public class AccessController { /** * 处理这个Con ...