美素数
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 2507 Accepted Submission(s): 857
Problem Description
小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识。
问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数。
给定一个区间,你能计算出这个区间内有多少个美素数吗?
问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数。
给定一个区间,你能计算出这个区间内有多少个美素数吗?
***********不要再忘记给吧b[1]b[0]赋值***************
/*#include<stdio.h>
#include<math.h>
int mei(int a) //超时;
{
int s=0,k=0,i,n;
for(i=0;;i++)
{
s=s+a%10;
a=a/10;
if(a==0)
break;
}
if(s==1)
return 0;
else
{
n=(int)sqrt(s);
for(i=2;i<=n;i++)
{
if(s%i==0) return 0;
}
return 1;
}
}
int a[1000010];
int main()
{
int t,l,i,j,r,m,k;
scanf("%d",&t);
int c;
c=t;
while(t--)
{
scanf("%d%d",&l,&r);
for(i=l,m=0;i<=r;i++,m++)
{
a[m]=i;
k=m;
}
for(j=2;j<sqrt(r);j++) //筛选法求素数
{
for(i=0;i<=k;i++)
{
if(a[i]%j==0&&a[i]!=j)
a[i]=0;
if(a[i]==1)
a[i]=0;
}
}
int sum=0;
for(i=0;i<=k;i++)
{
if(a[i]!=0)
{
if(mei(a[i]))
sum++;
}
}
printf("Case #%d: %d\n",c-t,sum);
}
return 0;
}*///打表法,先求出2到R间所有美素数,存于数组中,
//利用2到L与2到R间美素数的差值 ,直接就得出结果;(复杂的工作之做了一次)
//因而节省了时间 代码如下
/*
#include<stdio.h>
#include<string.h>
#include<math.h>
int a[1000010]={0},b[1000010];
int main()
{
memset(b,0,sizeof(b));
int i,j,k,l,r,t;
int s;
int y=0;printf("%d\n%d\n",b[2],b[1]);
//筛选法求1001000内所有素数
for(i=2;i*i<1000010;i++)
{
if(!a[i])
for(j=i+i;j<1001000;j+=i)
a[j]=1;
}
printf("%d\n%d\n",b[2],b[1]);
//判断该素数是不是美素数
for(i=2;i<1000010;i++)
{
if(!a[i]) //是素数才继续判断是美素数
{
s=0;
k=i;
while(k)
{
s+=k%10;
k/=10;
}
if(!a[s])
{
y++;
}
}
b[i]=y;
}printf("%d\n%d\n",b[2],b[1]);while(1);
scanf("%d",&t);
for(i=1;i<=t;i++)
{
scanf("%d%d",&l,&r);
printf("Case #%d: %d\n",i,b[r]-b[l-1]);
}
return 0;
} */
#include<stdio.h>
#include<string.h>
#include<math.h>
int a[1000010]={0};int b[1000010];
int main()
{
memset(b,0,sizeof(b));
int i,j,k,l,r,t;
int s;
int y=0;
//筛选法求1001000内所有素数
for(i=2;i*i<1000010;i++)
{
if(!a[i])
for(j=i+i;j<1001000;j+=i) //此处1001000>定义的1000010,导致数组越界,
a[j]=1; //进入数组b内存区域,故此时b[1000010]的值
} //会发生不确定变化,若后面不对b[1]b[0]赋0
//判断该素数是不是美素数 //最后结果会发生错误
for(i=2;i<1000010;i++)
{
if(!a[i]) //是素数才继续判断是美素数
{
s=0;
k=i;
while(k)
{
s+=k%10;
k/=10;
}
if(!a[s])
{
y++;
}
}
b[i]=y;
}
scanf("%d",&t);
for(i=1;i<=t;i++)
{
scanf("%d%d",&l,&r);
b[1]=b[0]=0;
printf("Case #%d: %d\n",i,b[r]-b[l-1]);
}
return 0;
}
Input
第一行输入一个正整数T,表示总共有T组数据(T <= 10000)。
接下来共T行,每行输入两个整数L,R(1<= L <= R <= 1000000),表示区间的左值和右值。
接下来共T行,每行输入两个整数L,R(1<= L <= R <= 1000000),表示区间的左值和右值。
Output
对于每组数据,先输出Case数,然后输出区间内美素数的个数(包括端点值L,R)。
每组数据占一行,具体输出格式参见样例。
每组数据占一行,具体输出格式参见样例。
Sample Input
3 1 100 2 2 3 19
Sample Output
Case #1: 14 Case #2: 1 Case #3: 4