码迷,mamicode.com
首页 > 其他好文 > 详细

SPOJ Problem 2: Prime Generator

时间:2015-02-14 22:31:29      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

嗯。。在SPOJ上刷的第二题。

一开始不知道哪错了,后来发现i出现了两遍。。

因为m<10^9,所以用素数筛筛32000以内的数,开一个4000的数组存储就行。然后再从n开始用素数筛,总之效率还行。

代码如下:

//0.01s 3.2M
#include<cstdio>
#include<cstring>
#include<cmath>
int n,i,j,t,m,k,tot;
int a[100005],b[4000];
int prime[40000];
int shai(int s){
    int i,j;
    memset(prime,0,sizeof(prime));
    prime[1]=2;
    i=2;
    while(i<s){
        prime[i]=1;
        for(j=i;j<=s/i;j++){
            prime[j*i]=2;
        }
        while(prime[i])i++;    
    }
    tot=0;
    for (i=1;i<=s;i++){
        if (prime[i]==1)b[++tot]=i;
    }
    return 1;
}
int main(){
    shai(32000);
    for (scanf("%d",&t);t;t--){
        scanf("%d%d",&n,&m);
        k=m;
        k=int(sqrt(double(k)));
        memset(a,0,sizeof(a));
        for (j=1;j<=tot;j++){
            int less = n / b[j];
            if (less<b[j])less=b[j];
            for (i=less;i<=m/b[j];i++){
                if (i*b[j]<n)continue;
                a[i*b[j]-n]=1;
            }
            if (b[j]*b[j]>m)break;
        }
        for (i=0;i<=m-n;i++){
            if (a[i]==0&&i+n!=1)printf("%d\n",i+n);
        }
        if (t)printf("\n");
    }
    return 0;
}

 

SPOJ Problem 2: Prime Generator

标签:

原文地址:http://www.cnblogs.com/moris/p/4292178.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!