//方法有点笨,还是莫比乌斯算法求素数,这个方法我用了几年了,很好用,我们全家都用它。
AC代码:
#include<stdio.h> #include<string.h> #define max 1005 int prime[max]; int isprime[max]; int vis[max]; int a[max]; void Init() { int i,j,cnt=0; memset(vis,0,sizeof(vis)); memset(isprime,0,sizeof(isprime)); for(i=2;i<max;i++) { if(vis[i]==0) { prime[cnt++]=i; } for(j=0;j<cnt&&i*prime[j]<max;j++) { vis[i*prime[j]]=1; } } for(i=0;i<cnt;i++) { isprime[prime[i]]=1; } isprime[1]=1; } int main() { Init(); int n,c; while(scanf("%d%d",&n,&c)!=EOF) { int i; int cnt=0; for(i=1;i<=n;i++) { if(isprime[i]) { a[cnt++]=i; } } printf("%d %d: ",n,c); if(cnt%2==1) { if(2*c>=cnt) { int k=0; for(i=0;i<cnt;i++) { if(k==0) { printf("%d",a[i]); k++; } else { printf(" %d",a[i]); k++; } } printf("\n\n"); } else { int k=0; for(i=cnt/2-c+1;i<cnt/2+c;i++) { if(k==0) { printf("%d",a[i]); k++; } else { printf(" %d",a[i]); k++; } } printf("\n\n"); } } else { if(2*c-1>=cnt) { int k=0; for(i=0;i<cnt;i++) { if(k==0) { printf("%d",a[i]); k++; } else { printf(" %d",a[i]); k++; } } printf("\n\n"); } else { int k=0; int x=(cnt+1)/2-(c*2-1)/2; int y=(cnt+1)/2+(c*2-1)/2; for(i=x-1;i<=y;i++) { if(k==0) { printf("%d",a[i]); k++; } else { printf(" %d",a[i]); k++; } } printf("\n\n"); } } } return 0; }