这题目猛一看是个水题,仔细一看还真是个水题,好吧其实大神们都不用仔细看的。
基本思路就是筛法求素数,这个题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>里!
原文:http://www.cnblogs.com/xuezhonghao/p/4859556.html