X-man

导航

hdu 4548 美素数

#include<stdio.h>
#include<string.h>
#include<math.h>
const int n=1000100;
bool visit[n];
int prime[n];
int ans[70000];
int a[60];//下标所对应的值不为素数,置0
int js;
int isprime()
{
    //int N;
    for(int i=0; i<60; i++)
        a[i]=i;//初始化自然序列
    a[1]=0;//1不为素数
    for(int i=2; i<=sqrt(60+0.5); i++)
    {
        //对任一不超过N的合数,其素因子不会超过根号下N
        if(a[i]!=0)
            for(int j=2; i*j<60; j++)
                a[i*j]=0;//将所有合数置0
    }
    //for(int i=0;i<60;i++)
  //printf("%d ",a[i]);
    return  0;
}

int init_prim()
{
    memset(visit,true,sizeof(visit));
    int num=0;
    for(int i=2; i<=n; i++)
    {
        if(visit[i]==true)
        {
            num++;
            prime[num]=i;//从下标1开始存数
        }
        for(int j=1; (j<=num)&&(i*prime[j]<=n); j++)
        {
            visit[i*prime[j]]=false;
            if(i%prime[j]==0)break;
        }
    }
    //printf("%d\n",num);
    js=0;
    for(int i=1; i<=num; i++)
    {
        int k=prime[i];
        int sum=0;
        for(int j=0;k;j++)
        {
            sum+=k%10;
            k=k/10;
        }
        if(a[sum])ans[js++]=prime[i];
    }
    //for(int i=0;i<js/100;i++)
    //printf("%d ",ans[i]);
        return 0;
}

int main()
{
    int _case;
    int l,r;
    int min,max;
    isprime();
    init_prim();
    scanf("%d",&_case);
    for(int i=1; i<=_case; i++)
    {
        min=0;
        //max
        scanf("%d %d",&l,&r);
        for(int j=0;j<js;j++)
        {
            if(ans[j]>=l&&ans[j]<=r)min++;
            if(ans[j]>r)break;
        }
        printf("Case #%d: ",i);
        printf("%d\n",min);
    }
    return 0;
}

素数打表,飘过!!!

打了两个表:

             (1)。利用素数模板打prime[]表(prime的值为素数)

             (2)。打美素数表ans[]时,打了a[]的小素数表,判断各位数之和是否为素数(该数组下标所表示的数为若为素数

                    ,数组的值就是其本身,否则为0),筛选出美素数ans[]表。

posted on 2013-05-18 16:43  雨钝风轻  阅读(303)  评论(0编辑  收藏  举报