给你数n c,求在1-n中的素数,如果这个素数序列为奇数,求中间c*2-1个素数,偶数则求c*2个素数。 很基本的,先打表,然后我的做法是,把最开始那个表素数里存成纯素数表中的编号,然后下面就简单了,细节处理注意一下就好了。 #include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> #define MAX 30000 using namespace std; int pri[MAX]; int a[MAX]; void init() { int i,j; memset(a,0,sizeof(a)); for(i=1; i<MAX; i++) a[i] = 1; a[1] = 1; for(i=2; i<MAX; i++) for(j=2; j*i<MAX; j++) if( a[i] == 1 ) a[i*j] = 0; int num = 1; for(i=1; i<MAX; i++) if( a[i] == 1 ) { a[i] = num; pri[num] = i; num++; } } int main() { int n,i,k,c; init(); while( ~scanf("%d%d",&n,&c) ) { int ind = n; printf("%d %d:",n,c); while( a[ind] == 0 ) ind--; int num = a[ind]; if( num % 2 == 0 && c*2 >= num || num % 2 == 1 && c*2-1 >= num ) { for(i=1; i<=num; i++) printf(" %d",pri[i]); printf("/n/n"); continue; } if( num % 2 == 0 ) { k = c*2; num = num/2-c+1; } else { k = c*2-1; num = num/2-c/2+1; } for(i=num; i<num+k; i++) printf(" %d",pri[i]); printf("/n/n"); } return 0; }