HDU 4548 美素數 (素數打表+前綴和)

美素數

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 7548    Accepted Submission(s): 2661



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
 

Source


素數打表+前綴和

代碼:

#include<cstdio> 
#include<cstring>
using namespace std;
const int M=1e6+1;
bool num[M];//素數打表 
int  ans[M];//前綴和,ans[i]表示從1到i 共有多少個美素數 

void init_prime()
{
 	 memset(num,1,sizeof(num));	
	 num[1]=0;
	 for(int i=2;i<=M;i++)
     {
        if(num[i])
        {
            for(int j=2*i;j<=M;j+=i)
            num[j]=0;
        }
     }		
}
void init_ans()
{
    memset(ans,0,sizeof(ans));
    for(int i=2;i<=M;i++)
    {
	    if(num[i])
	    {
	        int s=0;
	        int temp=i;
	        //s爲i各位數字和
	        while(temp>0) 
	        {
	            s+=temp%10;
	            temp/=10;
	        }
	        
	        if(num[s])
	        {
	           ans[i]=ans[i-1]+1;
	        }
	        else
		{
    		   ans[i]=ans[i-1];
       		}
	    }
	    else ans[i]=ans[i-1];	
    }

}

int main()
{
    int n,Case=0;
    init_prime();
    init_ans(); 
    scanf("%d",&n);
    while(n--)
	{
            int L,R;
            scanf("%d%d",&L,&R);
	    //ans[R]-ans[L-1]計算區間 L-R內美素數的個數 
	    printf("Case #%d: %d\n",++Case,ans[R]-ans[L-1]);
        }
    return 0;
}




發佈了40 篇原創文章 · 獲贊 51 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章