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

博客内容涉及数论中的素数问题,讲述了如何处理一道关于素数中位数的算法题。作者指出,虽然题目理解不难,但在实际编程实现过程中可能会遇到一些细节处理的挑战,如vis数组大小的设定。解决方案包括根据素数数量的奇偶性,确定输出特定数量的素数,并保证中位数一致。当输出数超过给定范围时,输出所有不超过n的素数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目倒是不难,但是处理起来很恶心

之前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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值