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 19Sample Output
Case #1: 14 Case #2: 1 Case #3: 4 題解:數據過大,打表處理一下#include <iostream>
#include <cstdio>
using namespace std;
int a[1000005];
int b[1000005];
int juge(int m)
{
for(int i=2; i*i<=m; i++)
if(m%i==0)
return 0;
return 1;
}
int tongji()
{
int total=0;
for(int i=2; i<1000100; i++)
{
if(juge(i))
{
a[i]=1;
int f=i,num=0;
while(f>0)
{
num+=f%10;
f/=10;
}
if(a[num])
total++;
}
b[i]=total; //前i個數的含有的美素數
}
}
int main()
{
tongji();
int l,r,t,k=1;
cin>>t;
while(t--)
{
cin>>l>>r;
printf("Case #%d: %d\n",k++,b[r]-b[l-1]); //必須是l-1,不然2 2這個案例會錯
}
}
還有紫書上的Eratosthenes篩法
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1000000+5;
int a[maxn+10];
int f[maxn+10];
void juge1()
{
memset(f,1,sizeof(f));
for(int i=2;i<=maxn;i++)
if((f[i]))
for(int j=i*2;j<=maxn;j+=i)
f[j]=0;
}
int sum(int a)
{
int s=0;
while(a/10)
{
s+=a%10;
a/=10;
}
s+=a;
return s;
}
int main()
{
juge1();
int l,r,T,k=1;
for(int i=2;i<=maxn;i++)
{
if((f[i])&&(f[sum(i)]))
a[i]=a[i-1]+1; //記錄前i個數的美素數個數
else
a[i]=a[i-1];
}
cin>>T;
while(T--)
{
cin>>l>>r;
printf("Case #%d: %d\n",k++,a[r]-a[l-1]);
}
return 0;
}