HDU 4548美素數(簡單題 儲存結果時需要注意不要超時)

果7發表於2013-08-19

美素數

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


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
 


                   題目大意:比較簡單,直接上程式碼吧!注意一下,需要先篩選一下素數,然後儲存美素數的時候直接利用類似線段樹的那種思想輸出某一段的個數。

           題目地址:美素數

AC程式碼:
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdio>
using namespace std;
int mark[1000005];
//int visi[1000005];
int ans[1000005];

int main()
{
    memset(mark,1,sizeof(mark));
    //memset(visi,0,sizeof(visi));
    ans[0]=0; ans[1]=0;
    int tes,cas,i,j,l,r;
    scanf("%d",&tes);
    for(i=2;i<=1000;i++)  //先篩選素數
    {
        if(mark[i])
        {
            for(j=i*i;j<1000000;j+=i)
                mark[j]=0;
        }
    }

    for(i=2;i<1000000;i++)
    {
        if(mark[i])
        {
            int tmp=0;
            int x=i;
            while(x)
            {
                tmp+=x%10;
                x/=10;
            }
            if(mark[tmp])
            {
                //visi[i]=1;
                ans[i]=ans[i-1]+1;
            }
            else
                ans[i]=ans[i-1];
        }
        else
            ans[i]=ans[i-1];
    }

    for(cas=1;cas<=tes;cas++)
    {
        scanf("%d%d",&l,&r);
        //int res=0;
        //for(i=l;i<=r;i++)  //這樣遍歷會TLE
           //res+=visi[i];
        printf("Case #%d: %d\n",cas,ans[r]-ans[l-1]);
    }
    return 0;
}
//46MS 8052K


相關文章