您的位置:首页 > 其它

素数及素数筛选算法训练基础题(一)

2015-12-21 13:45 239 查看
2.筛法求素数 (10分)

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: