#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[]表。