改进筛法- 质数中的质数(质数筛法)

1181 质数中的质数(质数筛法)

题目来源: Sgu

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题

如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做)。

Input

输入一个数N(N <= 10^6)

Output

输出>=N的最小的质数中的质数。

Input示例

20

Output示例

31

  最常见的筛法是筛去素数的倍数,但很显然这样会大量重复筛去相同的元素(虽然比筛去整数的倍数好)。而由合数的定义可以看出,合数必然有复数个数的素因子,我们只需要在第一个素因子处判断即可,否则会重复。

  而这道题需要在筛法的基础上加一次判断。

  【思路来自http://blog.csdn.net/morewindows/article/details/7347459】

//代码如下

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
bool su[100000000];
int shu[2000500],shusu[2000500];
int shai(int a){
int i=2,j,k=1,l=1;
while(shusu[l-1]<a){
if(!su[k-1]&&shusu[l-1]!=shu[k-1])
shusu[l++]=shu[k-1];
if(!su[i]) shu[k++]=i;
for(j=1;j<=k&&i*shu[j]<=a*10;j++)
{
su[i*shu[j]]=true;
if(i%shu[j]==0) break;
}
i++;
}
l--;
return l;

}
int main()
{
int n;
cin>>n;
// for(int i=1;i<=shai(n);i++) cout<<shusu[i]<<" ";
cout<<shusu[shai(n)]<<endl;
return 0;
}

时间: 2024-10-10 15:22:11

改进筛法- 质数中的质数(质数筛法)的相关文章

51Nod - 1181 质数中的质数(质数筛法)

如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数.例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数.现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做). Input输入一个数N(N <= 10^6)Output输出>=N的最小的质数中的质数.Sample Input 20 Sample Output 31 用eular质数筛即可 1 #include<iostream> 2 #include<cstdio>

1181 质数中的质数(质数筛法)

1181 质数中的质数(质数筛法) 基准时间限制:1 秒 空间限制:131072 KB 如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数.例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数.现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做). Input 输入一个数N(N <= 10^6) Output 输出>=N的最小的质数中的质数. Input示例 20 Output示例 31 #include <cstdlib>

1181 质数中的质数(质数筛法)(51NOD基础)

1181 质数中的质数(质数筛法)(51NOD基础) 题目来源: Sgu 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数.例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数.现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做). Input 输入一个数N(N <= 10^6) Output 输出>=N的最小的质数中的质数. Input示例 20 Outpu

51nod 1181 质数中的质数

1181 质数中的质数(质数筛法) 题目来源: Sgu 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数.例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数.现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做). Input 输入一个数N(N <= 10^6) Output 输出>=N的最小的质数中的质数. Input示例 20 Output

19新生赛 质数中的质数

题目描述: hhs刚刚学会了如何判断一个数是质数,但现在hhs被一个与质数有关的问题难住了,求求你帮他解决这个问 题.问题如下: 如果质数在质数列表中也是质数,则称为质数中的质数. 例如:3 5分别是排第二和第三的质数,因此它们是 质数中的质数. 现在给出一个数字N,最小质数> = N中的质数是多少.(可以考虑用质数筛法来做)输入格式: 输入一个数N(N <= 10^6)输入格式: 输出>=N的最小的质数中的质数.样例输入 20输出 31 代码 #include<bits/stdc

SDUT 3305 质数中的质数 (素数筛)

质数中的质数 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 如果一个质数,它在质数中的编号也是质数,就称为质数中的质数. 例如3是一个排在第2位质数,所以3是质数中的质数,虽然7是一个质数,但7排在第4位,所以7不是质数中的质数 给你一个数n,求出 >=n 的一个最小的质数中的质数 输入 输入一个数n(0<=n <= 10^6) 输出 输出>=n的最小的质数中的质数 示例输入 2 3 4 示例输出 3 3 5

输入一个数值,输出其是否质数,1是质数,0不是质数

输入一个数值,输出其是否质数,1是质数,0不是质数. 1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 5 int sushu(int num)//1是质数,0不是质数 6 { 7 int i; 8 int flag = 1;//默认是质数 9 10 if (num <= 1)//负数,0,1不是质数 11 { 12 flag = 0; 13 } 14 else 15 { 16 for (i = 2;i < num;

[51NOD1181]质数中的质数(质数筛法)(欧拉筛)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1181 思路:欧拉筛出所有素数和一个数的判定,找到大于n的最小质数序号p,并且判断p是不是质数,输出这个数. 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7 ┓┏┓┏┓┃ 8 ┛┗┛┗┛┃ 9 ┓┏┓┏┓┃ 10 ┛┗┛┗┛┃ 11 ┓┏┓┏┓┃ 12

质数判断(欧拉筛法)

题意简述 给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 题解思路 对于任意合数,必定可以有最小质因子乘以最大因子的分解方式. 因此,对于每个合数,只要用最大因子筛一遍,枚举时只要枚举最小质因子即可. 代码 #include <cstdio> using namespace std; const int t[5] = {0, 2, 7, 61}; int n, m, x; int ksm(int a, int r, int mod) { if (r == 0)