Problem Description
小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识。
问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数。
给定一个区间,你能计算出这个区间内有多少个美素数吗?
Input
第一行输入一个正整数T,表示总共有T组数据(T <= 10000)。
接下来共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
#include<stdio.h>
#include<string.h>
#include<math.h>
#include <queue>
#include <iostream>
#include<algorithm>
const int N=1000005;
#define ll long long
#define MAX 1<<<30
#define lson rt<<1
#define rson rt<<1|1
#define mid (l+r)>>1
#define getMin(a,b) a<b?a:b
#define getMax(a,b) a>b?a:b
int a[N],num[N];
void init()
{
int i,j;
memset(a,1,sizeof(a));
a[0]=a[1]=0;
for (i=2;i*i<=N;i++)
if (a[i])
{
for (j=i+i;j<=N;j+=i)
a[j]=0;
}
}
int fun(int x)
{ //求各数字和
int sum=0;
while (x)
{
sum+=x%10;
x/=10;
}
return sum;
}
void solve()
{
int i;
num[0]=num[1]=0;
for (i=2;i<N;i++)
if (a[i]&&a[fun(i)])
num[i]=num[i-1]+1;
else
num[i]=num[i-1];
}
int main()
{
int t,l,r,i,k,cnt,x;
init();
solve();
scanf("%d",&t);
for (k=1;k<=t;k++)
{
scanf("%d%d",&l,&r);
printf("Case #%d: %d\n",k,num[r]-num[l-1]);
}
return 0;
}下面这一篇是个高手写的,直接考过来的,就是看看我们跑出来的时间差多少,我的是48,人家还用了二分,31,时间也真是差出来了
推荐一下人家的博客http://www.cnblogs.com/wally/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
bool mark[1000010];
int num[1000010];
int k;
int Judge(int n){
int ans=0;
while(n){
ans+=n%10;
n/=10;
}
return ans;
}
void IsPrime(){
memset(mark,true,sizeof(mark));
mark[0]=mark[1]=false;
k=0;
for(int i=2;i*i<1000000;i++){
if(mark[i]){
for(int j=i*i;j<1000000;j+=i)
mark[j]=false;
}
}
for(int i=2;i<=1000010;i++){
if(mark[i]&&mark[Judge(i)]){
num[++k]=i;
}
}
}
int Binary_Search(int l,int h,int number){
while(l<=h){
int mid=(l+h)/2;
if(num[mid]==number)return mid;
else if(num[mid]>number)h=mid-1;
else l=mid+1;
}
return l;
}
int main(){
IsPrime();
int _case,n,m,t=1;
scanf("%d",&_case);
while(_case--){
scanf("%d%d",&n,&m);
int cnt=0;
int pos1=Binary_Search(1,k,n);
int pos2=Binary_Search(1,k,m);
pos1--;
if(num[pos2]==m)pos2++;
cnt=pos2-pos1-1;
printf("Case #%d: %d\n",t++,cnt);
}
return 0;
}
转载请注明原文地址: https://ju.6miu.com/read-1297263.html