求第N个素数

题意:

  输入一个数字N(N <= 200000),输出底N个素数.

思路:

  1-3000000中大约有210000素数.直接把这些素数打表,然后离线查询就OK.

代码:

 1 #include <iostream>
 2 #include <cmath>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cstdlib>
 6 #include <algorithm>
 7 #include <queue>
 8 #include <stack>
 9 #include <vector>
10 using namespace std;
11 typedef long long LL;
12
13 bool visit[3010000 + 7];
14 int prime[3000000 + 7];
15 int ans[220000 + 7];
16 void init_prim(){
17     memset(visit, true, sizeof(visit));
18     int num = 0;
19     for (int i = 2; i <= 3000000; ++i){
20         if (visit[i] == true){
21             num++;
22             prime[num] = i;
23         }
24         for (int j = 1; ((j <= num) && (i * prime[j] <= 3000000));  ++j){
25             visit[i * prime[j]] = false;
26             if (i % prime[j] == 0) break;
27         }
28     }
29 }
30
31 int main()
32 {
33     //freopen("input.txt", "r", stdin);
34     memset(prime, 0, sizeof(prime));
35     init_prim();
36     int cnt = 0;
37     for(int i = 0; i <= 3000000; i++){
38         if(prime[i])ans[cnt++] = prime[i];
39     }
40     int t;
41     scanf("%d", &t);
42     while(t--){
43         int n;
44         scanf("%d", &n);
45         printf("%d\n", ans[n - 1]);
46     }
47     return 0;
48 }
时间: 2024-10-06 10:29:05

求第N个素数的相关文章

求100之内的素数

题目:求100之内的素数 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数. 1 package com.li.FiftyAlgorthm; 2 3 /** 4 * 题目:判断101-200之间有多少个素数,并输出所有素数. 5 * 程序分析:判断素数的方法:用一个数分别去除2得到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数. 6 * @author yejin 7 */ 8 public class Prime

C语言学习笔记--求100-999之间的素数(用函数调用)

编写函数prime(n),如果n为素数,return 1,否则return 0.在main函数中调用函数prime(n),求100-999之间的素数 1 #include<stdio.h> 2 #include<math.h> 3 int main() 4 { 5 int prime(int i); 6 int i; 7 for(i=100;i<=999;i++) 8 { 9 prime(i); 10 if(prime(i)==1) 11 { 12 printf("

一道面试题:用多线程求1000以内的素数有多少个?并给出消耗时间

我曾经去一个公司面试,遇到这么一个题目:求1000以内的素数有多少个?用多线程实现,并给出消耗时间.我想了半天,没有想出多线程的解决方案.今天因为机缘到了,我浅谈下我的解法. 这道题,显然得考虑两个问题: 1.多线程的问题 2.算法性能问题 有人觉得1000以内还考虑什么算法性能?这肯定很快.但是话说回来,这个都有必要用多线程吗?如果我们求10000000以内的素数有多少个?是不是必须考虑以上两个问题了?多线程和算法优化的目的都是为了提高程序执行的效率.我们首先来考虑算法问题,什么是素数?素数:

求1-100内的素数(包括100)

public class PrimeNumber { // 求1-100内的素数(包括100) public static void main(String[] args) { int j = 0; System.out.println("输出1-100之间的素数"); for (int i = 2; i <= 100; i++) {// 1既不是苏数,也不是合数 if (i < 4) { System.out.println(i); continue;//注意此处有con

Ruby、PHP与SHELL中求50之内的素数方法

求50之内的素数,ruby的代码如下: #encoding:utf-8 #求50以内的素数(注意数字中..与...的区别) for i in 2..50     f=true #起始假定每个数都是素数     for p in 2...i #比自身小的正整数(1和自身除外) if i%p==0 #如果能整除 f=!f #那么这个数不是素数 break #并且跳出这层循环         end # if 结束     end #内层循环结束     print i," " if f #

用筛选法求100以内的素数(数组)

用筛选法求100以内的素数,要求使用数组. #include "stdafx.h" #include<iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int a[100],i,b[100],j,n=0;     //数组a[100]来放用于判断的数,数组b[100]来放素数 for(i=0;i<100;i++)       //注意这里i不能从1开始,因为数组a的首位是a[0]

求小于10000的素数的个数 Exercise06_10

1 /** 2 * @author 冰樱梦 3 * 时间:2018年下半年 4 * 题目:求小于10000的素数的个数 5 * 6 */ 7 public class Exercise06_10 { 8 public static void main(String[] args){ 9 int sum=0; 10 for(int i=1;i<=1000;i++){ 11 if(isPrime(i))sum++; 12 } 13 System.out.println("1000以内素数的个数

编程求100内的素数

描述:素数就是能被1和本身整除,不能被其他整数整除的数.编程求100以内的素数. #include<iostream> using namespace std; int main() { int flag; for(int i=2;i<=100;i++) { flag=0; for(int j=2;j<i;j++) { if(i%j==0) flag=1; } if(flag==0) cout<<i<<" "; } return 0; }

求50-100内的素数(java)

实现代码: public class sushu { public static void main(String[] args) { for(int i=50 ; i<=100; i++){ boolean isprime = true ; for(int j=2; j<=Math.sqrt(i); j++){ if(i%j==0) isprime=false; break; } if(isprime) System.out.println(i+""); } } } 代码

HDU XXXX:求[L,R]的素数数量(数位DP)

Problem G Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/131072K (Java/Other) Total Submission(s) : 62   Accepted Submission(s) : 28 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description S number is the number wh