1. 程式人生 > >hdoj 4548 美素數 【打表】

hdoj 4548 美素數 【打表】

scan == mit return else 多少 -1 time 另類

另類打表:將從1到n的滿足美素數條件的數目賦值給prime[n],這樣最後僅僅須要用prime[L]減去prime[R-1]就可以;

美素數

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


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

代碼:

#include<stdio.h>
#include<string.h>
#define MAXN 1000005
int pri[MAXN] = {1,1};
int prime[MAXN];

int mei( int n )
{
	int i, sum = 0, pre = n;
	while(n){
		sum += n%10;
		n/=10;
	}
	if( pri[sum] == 0 )
	return 1;
	else
	return 0;
}

void f()
{
	for( int i = 2, k = 0; i < MAXN; i ++ ){
		if( pri[i] == 0 ){
			if( mei(i) )
			++k;
			for( int j = i+i; j < MAXN; j += i )
			pri[j] = 1;
		}
		prime[i] = k;
	}
}

int main()
{
	int l, r, t, ans, v = 1;
	scanf("%d", &t );
	f();
	while( t -- ){
		scanf( "%d%d", &l, &r );
		printf( "Case #%d: ", v++ );
		printf( "%d\n", prime[r]-prime[l-1] );
	} 
	return 0;
}


hdoj 4548 美素數 【打表】