题目倒是不难,但是处理起来很恶心
之前vis数组开小了,WA掉了
给定n c如果1到n之间有奇数个素数
则输出2*c-1个数,保证1-n之间素数的中位数同样为这2*c-1个数的中位数
偶数时,对应输出2*c个数,规则同上
但是如果输出数的最大值超出n,则输出1-n之间所有的素数
我的办法实现找到1-n之间素数的个数num,判断奇偶
若为奇:则输出num/2左侧的c-2个数,右侧的c个数以及num位置对应的数
若为偶:则输出num/2左侧的c-1个数,右侧的c个数以及num位置对应的数
0ms代码如下:
#include <math.h>
#include <string.h>
#include <stdio.h>
int prime[500], vis[1050], cnt;
void gen_primes() {
int i, j;
prime[1] = 1;
cnt = 2;
for(i=2; i<=1010; ++i) {
if(!vis[i]) {
prime[cnt++] = i;
for(j=i+i; j<=1010; j+=i) {
vis[j] = 1;
}
}
}
}
int main(void) {
int n, c, num, i, copy, flag;
gen_primes();
while(scanf("%d%d", &n, &c) != EOF) {
num = 0;
// for(i=1; i<cnt; ++i)
// printf("%d ", prime[i]);
while(prime[++num] <= n);
num--;
flag = 1;
if(num%2) {
flag = 2;
}
printf("%d %d:", n, c);
copy = num/2;
if(copy-(c-flag)<1 || copy+c>num) {
for(i=1; i<=num; ++i) {
printf(" %d", prime[i]);
}
} else {
for(i=copy+flag-c; i<=copy+c; ++i) {
printf(" %d", prime[i]);
}
}
printf("\n\n");
}
return 0;
}