素数表(Eratosthenes)
怎么判断一个数是素数?
常规的方法是枚举从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)的更多相关文章
- poj 2262【素数表的应用---判断素数】【哈希】
Goldbach's Conjecture Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 35214 Accepted: ...
- hdu 5407 CRB and Candies(组合数+最小公倍数+素数表+逆元)2015 Multi-University Training Contest 10
题意: 输入n,求c(n,0)到c(n,n)的所有组合数的最小公倍数. 输入: 首行输入整数t,表示共有t组测试样例. 每组测试样例包含一个正整数n(1<=n<=1e6). 输出: 输出结 ...
- 埃氏筛法求素数&构造素数表求素数
埃氏筛法求素数和构造素数表求素数是一个道理. 首先,列出从2开始的所有自然数,构造一个序列: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1 ...
- <编程>比较两种素数表生成算法+计算程序运行时间+通过CMD重定向测试程序
最近学习加密算法,需要生成素数表,一开始使用简单的循环,从2开始判断.代码如下: #include<iostream> #include<cstdio> #include< ...
- UVA10006 - Carmichael Numbers(筛选构造素数表+高速幂)
UVA10006 - Carmichael Numbers(筛选构造素数表+高速幂) 题目链接 题目大意:假设有一个合数.然后它满足随意大于1小于n的整数a, 满足a^n%n = a;这种合数叫做Ca ...
- 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 ...
- 素数筛 : Eratosthenes 筛法, 线性筛法
这是两种简单的素数筛法, 好不容易理解了以后写篇博客加深下记忆 首先, 这两种算法用于解决的问题是 : 求小于n的所有素数 ( 个数 ) 比如 这道题 在不了解这两个素数筛算法的同学, 可能会这么写一 ...
- BZOJ_1025_[SHOI2009]_游戏_(素数表+最小公倍数+DP)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1025 分析 对于\(n\),转一圈回来之后其实是好几个环各转了整数圈.这些环中的数为\(1,2 ...
- [Swust OJ 1125]--又见GCD(数论,素数表存贮因子)
题目链接:http://acm.swust.edu.cn/problem/1125/ Time limit(ms): 1000 Memory limit(kb): 65535 Descriptio ...
- 埃氏素数筛法(Eratosthenes)
埃氏筛法: 对于每一个小于n的非负整数p,删去2p,3p,4p......,当处理完所有数后,还没有删除的就是素数. 想法:用a记录素数表,a[i]=1表示不是素数,a[i]=0表示是素数. #inc ...
随机推荐
- C++ lambda表达式 (一)
为什么要lambda函数 匿名函数是许多编程语言都支持的概念,有函数体,没有函数名.1958年,lisp首先采用匿名函数,匿名函数最常用的是作为回调函数的值.正因为有这样的需求,c++引入了lambd ...
- UVALive 6869 Repeated Substrings
Repeated Substrings Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Descri ...
- Linux系统消息队列框架Kafka单机安装配置
http://www.ithao123.cn/content-11128587.html
- 保留原先小程序名称 更改微信小程序主体
首先给小程序开发者普及一些官方消息: 1.目前官方是不允许修改已经认证的小程序主体信息!(公众号可以修改) 2.小程序与公众号的名称是全平台唯一,即如果小程序叫‘ABC’其他小程序和公众号就不能存在‘ ...
- 洛谷 P1716 双调序列
P1716 双调序列 题目描述 电脑组的童鞋们经常玩一些智力PK小游戏,某月某日,发源于小朋友又发明了一种新的序列:双调序列,所谓的双调呢主要是满足如下条件描述: 假定有n(n<=1000)个整 ...
- NumPy基础入门学习
对于习惯使用了MATLAB的用户而言,学习NumPy这个python工具包付出的成本应该是不大的. NumPy的基本的object是多维数组,是一个有同样类型的数字等构成的一张表格,能够通过元组进行索 ...
- 【推荐】适合本科生的网络公开课(MOOC为主),不断更新……
题记:身在海大(湛江),是幸运还是不幸,每一个人有自己的定义.人生不能再来一次,唯有把握当下.提高自己,才可能在不能拼爹的年代靠自身实力前行.或许,我们做不了富二代.但我们每一个人.都有机会成为富二代 ...
- centOS6.3(64bit)Hadoop的Eclipse开发环境搭建
操作系统centos6.3(64位) 一个namenode 两个datanode Hadoop版本号:hadoop-1.1.2 Eclipse版本号:eclipse-standard-kepler-S ...
- .Net视图机制
.Net会有默认的约定. HomeController下面的Index,会默认渲染Home/Index.cshtml. 当然可以设置成别的,比如设置成About. using System; usin ...
- Javascript函数的基本概念+匿名立即执行函数
函数声明.函数表达式.匿名函数 函数声明:function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName = f ...