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; }