美素數 hd 4548

q923714892發表於2020-04-06
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>  
int su[1000000+11] = {1,1};  
int ant[1000000+11] = {0};  
bool check(int x)  
{  
    if (su[x])  
        return false;  
    int sum = 0;  
    while (x)  
    {  
        sum += (x % 10);  
        x /= 10;  
    }  
    if (su[sum])  
        return false;  
    return true;  
}  
int main()  
{  
    for (int i = 2 ; i <= 500000 ; i++)  
    {  
        if (su[i])  
            continue;  
        for (int j = i + i ; j <= 1000000 ; j += i)  
            su[j] = 1;  
    }  
    for (int i = 2 ; i <= 1000000 ; i++)  
    {  
        if (check(i))       
            ant[i] = ant[i-1] + 1;  
        else  
            ant[i] = ant[i-1];   
    }  
    int u,num = 1;  
    int l,r;  
    scanf ("%d",&u);  
    while (u--)  
    {  
        scanf ("%d%d",&l,&r);  
        printf ("Case #%d: %d\n",num++,ant[r] - ant[l] + (check(l) ? 1 : 0));  
    }  
    return 0;  
}