美素数
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 2124 Accepted Submission(s): 731
问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数。
给定一个区间,你能计算出这个区间内有多少个美素数吗?
接下来共T行,每行输入两个整数L,R(1<= L <= R <= 1000000),表示区间的左值和右值。
每组数据占一行,具体输出格式参见样例。
3 1 100 2 2 3 19
Case #1: 14 Case #2: 1 Case #3: 4
比往年题目有2个考点,1是素数筛法,2是数位拆解
/*
title:美素数
问题分类:素数筛法和数位拆分
*/
#include<stdio.h>
#include<string.h>
//用来存放标记过的素数
int prime[1000001];
//用来记录素数个数
int primeSize=0;
//用mark[i]来标记该数字,mark[i]=true时是非素数
//即标记过,表示该数字为非素数
bool mark[1000001];
//素数筛法
void init(){
memset(mark,0,sizeof(mark));
for(int i=2;i<1000001;i++){
if(mark[i]==true){
continue;
}
prime[primeSize++]=i;
for(int j=i+i;j<1000001;j+=i){
mark[j]=true;
}
}
}
//数位拆分
//用来存放每一位数字
int shu[8];
int chai(int x){
memset(shu,0,sizeof(shu));
int size=0;
while(x!=0){
shu[size++]=x%10;
x/=10;
}
int ans=0;
for(int i=0;i<size;i++){
ans+=shu[i];
}
return ans;
}
int main(){
freopen("in.txt","r",stdin);
printf("%d",chai(34));
int zu;
init();
while(scanf("%d",&zu)!=EOF){
for(int t=1;t<=zu;t++){
printf("Case #%d:",t);
int a,b;
scanf("%d%d",&a,&b);
for(int i=a;i<=b;i++){
if(mark[a]==false){
int ans=chai(i);
if(mark[ans]==false){
printf(" %d",i);
}
}
}
printf("\n");
}
}
return 0;
}