您的位置:首页 > 其它

hdu1319 Prime Cuts(数论:素数打表,不难但是恶心)

2014-07-13 13:12 323 查看
题目倒是不难,但是处理起来很恶心

之前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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: