九度1040:Prime Number

本文介绍了一种使用素数筛法解决求第K个素数问题的方法,并给出了具体的C++实现代码。文章通过实际案例分享了调试过程中遇到的问题及解决方案。

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

题目1040:Prime Number

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:8894

解决:3526

题目描述:

Output the k-th prime number.

输入:

k≤10000

输出:

The k-th prime number.

样例输入:
3
7
样例输出:
5
17
来源:
2008年上海交通大学计算机研究生机试真题
这题用素数筛法做比较好。昨晚上刚学会了这个方法,结果今天一写出来,本地直接崩溃了。。。直觉告诉我肯定是数组越界了,因为毕竟这道题要输出第10000个素数。于是我把int类型换成了long......... 也就是说我记错了,long和int都是4个字节32位的,我又把int记成16位的了。。调试才发现int到了65537还有值,我就明白了。。实际上第100000个素数也才100000多,我用int和long都不行的原因是,我在标记非素数的时候,是从j=i*i开始的,这个乘法可能导致结果超过32bit数表示的范围,于是把j=i*i改成j=i(但这样会导致一些重复工作),或用long long就可以了,一遍AC
#include <iostream>
#include <cstdio>
#define N 110001
using namespace std;
bool mark[N];
int prime[N];
void init()
{
    int size=1;
    for(long long i=2;i<N;i++){
        if(mark[i]!=true){
            prime[size++]=i;
            for(long long j=i*i;j<N;j+=i){
                mark[j]=true;
            }
        }

    }
}
int main()
{
    init();
    int k;
    while(scanf("%d",&k)!=EOF){
        printf("%d\n",prime[k]);
    }
    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值