Prime Cuts(POJ-1595)
题目链接:https://cn.vjudge.net/contest/319720#problem/B
题意:给出两个数 n、c,求从 1~N 的素数序列,若素数个数为奇数,则输出序列中心的 2*c-1 个素数,若为偶数,则输出序列中心的 2*c 个素数。若 c 大于素数个数,则输出整个序列。
思路:
打表求素数,再计算序列中心位置,然后判断奇偶输出即可。注意这里的序列中心的意思( = = 一开始理解错了)
然后这题让我掌握一下如何输出序列中心的方法吧。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<string> 7 #include<cstdlib> 8 #include<queue> 9 #include<set> 10 #include<map> 11 #include<stack> 12 #include<ctime> 13 #include<vector> 14 #define INF 0x3f3f3f3f 15 #define PI acos(-1.0) 16 #define N 1100 17 #define MOD 1e9+7 18 #define E 1e-6 19 #define LL long long 20 using namespace std; 21 int prime[N],cnt=1; 22 bool bprime[N]; 23 void make_prime() 24 { 25 memset(bprime,true,sizeof(bprime)); 26 bprime[0]=false; 27 28 for(int i=2;i<=N;i++) 29 for(int j=i+i;j<=N;j+=i) 30 bprime[j]=false; 31 32 for(int i=0;i<=N;i++) 33 if(bprime[i]) 34 prime[cnt++]=i; 35 } 36 int main() 37 { 38 make_prime(); 39 40 int n,c; 41 while(scanf("%d%d",&n,&c)!=EOF&&(n+c)) 42 { 43 int pos=0; 44 for(int i=1;i<cnt;i++)//求序列中心 45 { 46 if(prime[i]<=n&&prime[i+1]>n) 47 { 48 pos=i; 49 break; 50 } 51 } 52 53 printf("%d %d: ",n,c); 54 55 if (c>pos){ 56 for (int i=1;i<=pos;i++){ 57 printf("%d ",prime[i]); 58 } 59 printf("\n\n"); 60 continue; 61 } 62 63 64 if(pos%2) 65 { 66 for(int i=(pos-(c*2-1))/2+1;i<=(pos-(c*2-1))/2+c*2-1;i++) 67 printf("%d ",prime[i]); 68 printf("\n\n"); 69 } 70 else 71 { 72 for(int i=(pos-c*2)/2+1;i<=(pos-c*2)/2+c*2;i++) 73 printf("%d ",prime[i]); 74 printf("\n\n"); 75 } 76 } 77 78 return 0; 79 }