(数论 欧拉筛法)51NOD 1181 质数中的质数(质数筛法)

如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做)。
 
Input
输入一个数N(N <= 10^6)
Output
输出>=N的最小的质数中的质数。
Input示例
20
Output示例
31
解:
最初版本 15 ms 9812 KB
 1 #include <stdio.h>
 2 #define MAXN 2000000
 3 int vis[MAXN]={1,1}, pri[MAXN];
 4 
 5 int phi(int n)
 6 {
 7     for (int i = 2, m = 0; i < MAXN; i++)
 8     {    
 9         if (vis[i] == 0)
10         {
11             pri[m++] = i;
12             if (i >= n && vis[m] == 0) return pri[m - 1];
13         }
14         for (int j = 0; j < m; j++)
15         {
16             if (i * pri[j] > MAXN) break;
17             vis[i * pri[j]] = 1;
18             if (i%pri[j] == 0) break;
19         }
20     }
21 }
22 
23 int main()
24 {
25     int n;
26     while (scanf_s("%d", &n) != EOF) printf("%d\n", phi(n));
27     return 0;
28 }

卡数据范围 15 ms 5904 KB

 1 #include <stdio.h>
 2 #define MAXN 1000200
 3 int vis[MAXN]={1,1}, pri[78510]

变数据类型 15 ms 2976 KB

 1 #include <stdio.h>
 2 #define MAXN 1000200
 3 char vis[MAXN]={1,1};
 4 int pri[78510]

 

posted @ 2018-10-19 09:18  Ekalos  阅读(400)  评论(2编辑  收藏  举报