素数及素数筛选算法训练基础题(一)
2015-12-21 13:45
239 查看
2.筛法求素数 (10分)
C时间限制:1 毫秒 | C内存限制:1 Kb
题目内容:
输入描述
输出描述
输入样例
输出样例
程序代码//先来讨论一下素数,素数就是只能被和它本身整除的数就是素数。
算1-10000000中有多少个素数,有一种最简单暴力的方法就是把这个区间的每一个数都遍历一遍,用一个判断函数判断他是否为素数。但是这样时间复杂度就为n^2,效率不高,而且如果你用这种方法求电脑估计会跑不出来结果
,于是就有了筛选素数这个方法,个人觉得筛选素数的思想真的很好,棒棒的O(∩_∩)O,那宝宝就要讲一下什么是筛选素数咯。
1,定义一个bool prime
,将偶数全部是false,奇数全为true。
2.[b]for(int i=3; i<=sqrt(n); i+=2)
{ if(prime[i])
for(int j=i+i; j<n; j+=i)
prime[j]=false;
}用这个方法再将有true的数再筛选一次,其思想是,如果这个数是素数,那么只要是这个数的倍数都不是素数,而且遍历的数不是j++,是j+=i,将那些素数的倍数都化为false,即把素数全部筛选出来了,是素数就为true,不是就为false,遍历一遍,将所有true找出来,即可求出有多少个素数。这样复杂度就会小的多。[/b]
#include<iostream>
#include<math.h>
#define N 10000001
using namespace std;
bool prime
;
int main()
{
int T;
cin>>T;
while(T--){
int x,n;
cin>>x>>n;
int count=0;
prime[2]=true;
for(int i=3; i<n; i++)
if(i%2==0)
prime[i]=false;
else
prime[i]=true;
for(int i=3; i<=sqrt(n); i+=2)
{ if(prime[i])
for(int j=i+i; j<n; j+=i)
prime[j]=false;
}
for(int i=2; i<=n; i++)
if( prime[i] )
//cout<<i<<endl;
count++;
if(prime[x]==true)
cout<<"YES"<<" "<<count<<endl;
else
cout<<"NO"<<" "<<count<<endl;
}
return 0;
}
C时间限制:1 毫秒 | C内存限制:1 Kb
题目内容:
1.素数判断:输入一个数x,判断是否是素数 2.筛法求素数:输入一个数n,判断从1到n有哪些数是素数,输入素数个数。
输入描述
Input contains an integer N in the first line, and then N lines follow. Each line consists of two integers x and n, separated by a space, one pair of integers per line. 有多组测试数据 第一行输出一个整数T 接下里T行里,每一行都有两个整数x和n. (x<=n<=10000000) (不用数了 一千万)
输出描述
每组数据输出一行: 先输出 YES or NO 表示是否为素数,然后输出一个整数count,表示[1,n]有count个素数。 用空格隔开
输入样例
1 3 10
输出样例
YES 4 hint:(样例解释,不需要输出) 3 是素数 故输出YES 比10小的素数有2 3 5 7 故输出4
程序代码//先来讨论一下素数,素数就是只能被和它本身整除的数就是素数。
算1-10000000中有多少个素数,有一种最简单暴力的方法就是把这个区间的每一个数都遍历一遍,用一个判断函数判断他是否为素数。但是这样时间复杂度就为n^2,效率不高,而且如果你用这种方法求电脑估计会跑不出来结果
,于是就有了筛选素数这个方法,个人觉得筛选素数的思想真的很好,棒棒的O(∩_∩)O,那宝宝就要讲一下什么是筛选素数咯。
1,定义一个bool prime
,将偶数全部是false,奇数全为true。
2.[b]for(int i=3; i<=sqrt(n); i+=2)
{ if(prime[i])
for(int j=i+i; j<n; j+=i)
prime[j]=false;
}用这个方法再将有true的数再筛选一次,其思想是,如果这个数是素数,那么只要是这个数的倍数都不是素数,而且遍历的数不是j++,是j+=i,将那些素数的倍数都化为false,即把素数全部筛选出来了,是素数就为true,不是就为false,遍历一遍,将所有true找出来,即可求出有多少个素数。这样复杂度就会小的多。[/b]
#include<iostream>
#include<math.h>
#define N 10000001
using namespace std;
bool prime
;
int main()
{
int T;
cin>>T;
while(T--){
int x,n;
cin>>x>>n;
int count=0;
prime[2]=true;
for(int i=3; i<n; i++)
if(i%2==0)
prime[i]=false;
else
prime[i]=true;
for(int i=3; i<=sqrt(n); i+=2)
{ if(prime[i])
for(int j=i+i; j<n; j+=i)
prime[j]=false;
}
for(int i=2; i<=n; i++)
if( prime[i] )
//cout<<i<<endl;
count++;
if(prime[x]==true)
cout<<"YES"<<" "<<count<<endl;
else
cout<<"NO"<<" "<<count<<endl;
}
return 0;
}
相关文章推荐
- ABP理论学习之审计日志
- UIView---汇总
- BUAA 更大公约数
- 企业年金
- Jenkins进阶系列之——18Jenkins语言本地化
- 产品策划六:App界面交互设计规范
- 【蓝桥第七周】安排会议室
- windows2008 R2访问php网站慢怎么办?
- 浅析python的metaclass
- MYSQL--存储过程-触发器-事务
- oracle简单写文件
- Jenkins进阶系列之——17Jenkins升级、迁移和备份
- 用python实现c4.5算法,并进行悲观剪枝
- mac下pip的安装
- java web 中定义全局属性的application
- RelativeLayout背景选择器,用不了到底是怎么回事?
- 浅析CC2540的OSAL原理
- Jenkins进阶系列之——16一个完整的JENKINS下的ANT BUILD.XML文件
- 转载--eclipse单步调试
- 导出visio2013文件中所有文本