题意:给定你一个数n,让你求出1-n内有多少个素数,再给你一个数d,如果2*d大于素数的个数则全部输出;
否则,如果个数为单数,输出2*d - 1个并且以中间那个素数为中心分别向两边输出d-1个;
如果偶数个,输出2*d个,也是以中间那个素数为中心向两边扩展;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> using namespace std; int prime[500],cnt=0; bool hash[524]; void Prime( ) { int t = ( int )sqrt( 1000.0 ) + 1; memset( hash , 0 ,sizeof( hash ) ); for(int i = 3 ; i <= t ; i += 2 ) { if( !hash[i>>1] ) { int x = i<<1; for( int j = i * i; j <= 1001; j += x ) { hash[j>>1] = true; } } } cnt = 1; prime[cnt++] = 1; prime[cnt++] = 2; t = 1000/2; for( int i = 1; i <=t ; i ++ ) { if( !hash[i] ) { prime[cnt++] = i * 2 + 1; } } } void Solve( int num , int n ) { int i = 0; for( i = 1 ; i < cnt ; i ++ ) { // printf( "%d\n",prime[i] ); if( num < prime[i] ) break; } i --; int t = (i + 1) / 2; if( 2*n >= i ) { for( int j = 1 ; j <= i ; j ++ ) printf( " %d",prime[j] ); } else { for( int j = t - n + 1 ; j <= t ; j ++ ) printf( " %d",prime[j] ); if( i %2 ==1 ) { for( int j = t + 1; j < t + n ; j++ ) { printf( " %d",prime[j] ); } } else for( int j = t + 1; j <= t + n ; j++ ) { printf( " %d",prime[j] ); } } } int main( ) { Prime(); int num,n; while( scanf( "%d %d",&num ,&n)==2 ) { printf( "%d %d:",num ,n ); Solve( num ,n ); printf( "\n\n" ); } //system( "pause" ); return 0; }