POJ3306 素数筛法

这题很明显得用素数筛法打出一个素数表 模拟一下求出第n个素数就可以了 

水题啊。。。。

#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define max 1000005
bool isprime[max];
void getprime()
{
    long long i,j;
    memset(isprime,1,sizeof(isprime));
    isprime[1]=0;
    isprime[0]=0;
    for(i=2; i<max; i++)
        if(isprime[i])
            for(j=i*i; j<max; j+=i)
                isprime[j]=0;
}
int main()
{
    getprime();
    int a,d,n;
    while(~scanf("%d%d%d",&a,&d,&n)&&(a+d+n))
    {
        int i,sum=0;
        for(i=a; sum<n; i+=d)
            if(isprime[i])
            {
                sum++;
                if(sum==n)
                    break;
            }
        printf("%d\n",i);
    }
    return 0;
}
时间: 2024-10-26 14:11:42

POJ3306 素数筛法的相关文章

POJ 1595 素数筛法

题意让求一段素数中间的几个素数 用素数筛法筛出范围内的素数然后确定一下就行了 注意题目中1也算作素数了 具体看代码 #include <iostream> #include<cstdio> #include<cstring> using namespace std; #define max 2000 bool isprime[max]; int prime[max],nprime; void getprime() { memset(isprime,1,sizeof(is

POJ2262 素数筛法

素数筛法的水题 知道怎么筛就能做出来 在从3开始遍历那个表就行了 放假是不是不让做这种水题= =  #include <iostream> #include<cstdio> #include<cstring> using namespace std; #define max 1000010 bool isprime[max]; void getprime() { long long i,j; memset(isprime,1,sizeof(isprime)); ispr

[算法]素数筛法

[方法一] [代码一] [cpp] view plaincopy //判断是否是一个素数   int IsPrime(int a){       //0,1,负数都是非素数       if(a <= 1){           return 0;       }       //计算枚举上界,为防止double值带来的精度损失,所以采用根号值取整后再加1,即宁愿多枚举一个,也不愿少枚举一个数       int bound = (int)sqrt(a) + 1;       for(int i

筛法求2~1000之间的所有素数

筛法求素数首先要建立筛子,这里利用数组作筛子.下标对应于数,相应下标变量的值标志是否在筛子中:为1表示在筛子中,为.表示已被筛去,不在筛子中.然后找每一轮筛选种子,筛选种子是完成一轮筛选后的下一个最小的素数,初值为2. 对每一轮筛选种子,筛去其所有倍数,即相应下标变量的值赋值为O.倍数初值为筛选种子的2倍. 筛选完成,筛子中剩下的即为素数. 程序如下: /*程序8-14,筛法求2至1000之间的所有素数*/ main() { int a[1000];/*筛子数组*/ int i; int min

acm-区间筛法求区间内素数的个数

问题描述 区间筛法求区间内素数的个数 for(ll i = 2;i*i <=b;i++) is_prime_small[i] = true; for(ll i = 0;i <=b-a;i++) is_prime[i] = true; for(ll i = 2;i*i <=b;i++) { if(is_prime_small[i]) { for(ll j = 2*i;j*j <=b;j += i) is_prime_small[j] = false; for(ll j = max(2

筛法选择素数,可以运行,但是没有输出,printf那句没有运行

问题描述 筛法选择素数,可以运行,但是没有输出,printf那句没有运行 程序可以运行,但是没有输出,没有任何反应..怎么回事,求救 #include<stdio.h> #include<stdlib.h> #define SIZE 1000 #define TRUE 1 #define FALSE 0 int main() { char sieve[SIZE]; char *sp; int number; for(sp=sieve;sp<&sieve[SIZE];)

筛法求素数

#include <iostream> #include <vector> using namespace std; #define MAX_LEN 1000000 void getPrimeTable(bool *prime); int main() { bool prime[MAX_LEN+1]; long a, b; long i; vector<long> vec;//由于数可能很大 long t; getPrimeTable(prime); while (ci

筛法求素数(java)

import java.util.Scanner; public class primeShaifa { public static void main(String[] args) { int n; Scanner cin = new Scanner(System.in); while (cin.hasNextInt()) { n = cin.nextInt(); int[] array = new int[n]; for (int i = 2; i < n; i++) { array[i]

如何用线性筛法求欧拉函数

前几天做了一个关于欧拉函数的题,当时就做超时了,因为我是暴力做的,后来百度了一下 线性晒法求欧拉函数,所以今天就打算系统的看一下筛法求欧拉函数的问题,该算法在可在线性时间内筛素数的同时求出所有数的欧拉函数: 先介绍一下暴力的欧拉函数: Eular(m) = m - (1-1/p1) - (1-1/p2) - ... - (1-1/pk)  [其中 p1, p2...pk为m的素因子] int Eular(int m) { int ret = m; for(int i=2; i<m; i++) {