JD 题目1040:Prime Number (筛法求素数)

OJ题目:click here~~

题目分析:输出第k个素数

贴这么简单的题目,目的不清纯

用筛法求素数的基本思想是:把从1開始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。

依次类推。直到筛子为空时结束。

如有:

1 2 3 4 5 6 7 8 9 10

11 12 13 14 15 16 17 18 19 20

21 22 23 24 25 26 27 28 29 30

1不是素数。去掉。剩下的数中2最小,是素数,去掉2的倍数。余下的数是:

3 5 7 9 11 13 15 17 19 21 23 25 27 29

剩下的数中3最小。是素数,去掉3的倍数,如此下去直到全部的数都被筛完,求出的素数为:

2 3 5 7 11 13 17 19 23 29

AC_CODE

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>

using namespace std ;
const int N = 1000000;
bool prime[N] ;
void initprime(){
    memset(prime, 1 , sizeof(prime)) ;
    prime[0] = prime[1] = 0 ;
    double t = sqrt(N) + 1 ;
    for(int i = 2;i < t;i++){
        if(prime[i]){
            for(int j = i + i;j < N;j += i)
                prime[j] = false ;
        }
    }
}

int main(){
    initprime();
    int k , t ;
    while(cin >> k){
        t = 0 ;
        for(int i = 0;i < N;i++){
            if(prime[i]){
                t++;
                if(t == k){
                    cout << i << endl ;
                    break ;
                }
            }
        }
    }
    return  0 ;
}
时间: 2024-08-05 15:24:29

JD 题目1040:Prime Number (筛法求素数)的相关文章

POJ 2689 - Prime Distance - [筛法求素数]

题目链接:http://poj.org/problem?id=2689 Time Limit: 1000MS Memory Limit: 65536K Description The branch of mathematics called number theory is about properties of numbers. One of the areas that has captured the interest of number theoreticians for thousan

九度OJ 1040 Prime Number (筛素数,试除法)

题目描述: Output the k-th prime number. 输入: k≤10000 输出: The k-th prime number. 样例输入: 3 7 样例输出: 5 17 这道题,好久以前使用试除法做的,原理是维护一个素数表,根据输入的num,确定是否之前算过,算过了,就直接输出,没算过,就现在开始算,并且把中间的素数全保存下来: #include<stdio.h> int k[10001]; int main(int argc, char *argv[]) { k[1]=

AOJ 0009 Prime Number(求素数)

题意:给定一个数n,判断从2—n中的素数个数是多少. KEY:这里有两种做法,一是没注释那个代码测试极端数据999999就会错的,二是注释掉的那段代码才能AC.对于一眼看上去很简单的题目,特别要注意时间复杂度. #include <iostream> #include <stdio.h> #include <string.h> const int maxn = 999999 + 5; int num[maxn]; using namespace std; int mai

POJ2739_Sum of Consecutive Prime Numbers【筛法求素数】【枚举】

Sum of Consecutive Prime Numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19350 Accepted: 10619 Description Some positive integers can be represented by a sum of one or more consecutive prime numbers. How many such representations d

poj 2689 Prime Distance 【数论】【筛法求素数】

题目链接:传送门 题目大意: 给你L和R两组数,L和R的范围是2^32,其间隔(即R-L最大为1,000,000.) .让你求出L和R之间素数的最大间隔和最小的间隔. 比如 2 17.之间的最小素数间隔是2 3,最大的素数间隔是11 17. 要是直接进行一个2^32次方筛法然后在判断是会T的. 我们这样来想,筛法求素数的原理是什么: /**vis数组标记为0则说明是素数*/ int vis[10005]; void getPrimevis(int n) { int m=sqrt(n+0.5);

HDU2710_Max Factor【水题】【筛法求素数】

Max Factor Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3966    Accepted Submission(s): 1289 Problem Description To improve the organization of his farm, Farmer John labels each of his N (1

uva 10375 唯一分解定理 筛法求素数【数论】

唯一分解理论的基本内容: 任意一个大于1的正整数都能表示成若干个质数的乘积,且表示的方法是唯一的.换句话说,一个数能被唯一地分解成质因数的乘积.因此这个定理又叫做唯一分解定理. 举个栗子:50=(2^1)*(5^2) 题目一般的思路就是要把素数表打出来,eg上面的例子 e={1,0,2,0,0......} 下面是两个题目,仅说说大致的思想: 题目一: E=(X1*X3*X4* ...*Xk)/X2   判断E是不是整数 如果把(X1*X3*X4* ...*Xk)分解成素数相乘,将X2也分解成素

一般筛法求素数+快速线性筛法求素数

素数总是一个比较常涉及到的内容,掌握求素数的方法是一项基本功. 基本原则就是题目如果只需要判断少量数字是否为素数,直接枚举因子2 ..N^(0.5) ,看看能否整除N. 如果需要判断的次数较多,则先用下面介绍的办法预处理. 一般的线性筛法 首先先介绍一般的线性筛法求素数 void make_prime() { memset(prime, 1, sizeof(prime)); prime[0]=false; prime[1]=false; int N=31700; for (int i=2; i<

【转载】一般筛法求素数+快速线性筛法求素数

素数总是一个比较常涉及到的内容,掌握求素数的方法是一项基本功. 基本原则就是题目如果只需要判断少量数字是否为素数,直接枚举因子2 ..N^(0.5) ,看看能否整除N. 如果需要判断的次数较多,则先用下面介绍的办法预处理. 一般的线性筛法 首先先介绍一般的线性筛法求素数 void make_prime() { memset(prime, 1, sizeof(prime)); prime[0]=false; prime[1]=false; int N=31700; for (int i=2; i<