SPOJ-2

这题目猛一看是个水题,仔细一看还真是个水题,好吧其实大神们都不用仔细看的。

基本思路就是筛法求素数,这个题M,N数值大,但|N-M|较小。

所以先列出sqrt(N)的素数表,之后从素数表中选数去M~N中剔除。(懒省事就直接提前打好素数表了)

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 
 5 //31623
 6 
 7 int a[3401] = {2~31607的所有质数} //太长了
 8 
 9 bool b[100010];
10 
11 int main(void)
12 {
13   int M, N;
14   int T;
15   int k;
16   scanf("%d", &T);
17   while(T--){
18     scanf("%d%d", &M, &N);
19     if(M == 1) M = 2;
20     memset(b, true, sizeof(b));//printf("%d\n", b[6]);
21     for(int i = 0; i <= 3400; ++i){
22       k = (M / a[i] + 1) * a[i];//Never write anymore
23       if(k == a[i]) k += a[i];
24       if((M % a[i] == 0) && (M != a[i])) b[0] = false;
25       while(k <= N){
26     b[k-M] = false;
27     k += a[i];
28     //printf("%d %d %d\n", k, a[i], b[0]);
29       }
30     }
31     for(int i = 0; i <= N-M; ++i)
32       if(b[i])
33     printf("%d\n", i+M);
34     printf("\n");
35   }
36   return 0;
37 }

1.对于学过pascal的人来说,memset中的sizeof到底放在哪里,真的是很纠结。

2.memset()在<cstring>里,在<cstring>里,在<cstring>里!

posted on 2015-10-07 21:27  AlanXue  阅读(146)  评论(0)    收藏  举报

导航