1. 程式人生 > >HDU4548 美素數【打表】【前綴和】

HDU4548 美素數【打表】【前綴和】

cas 包括 各位數之和 tar rip desc tdi memory pro

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4548

美素數

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


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>             //
此代碼已AC #include <string.h> #include <math.h> int a[1000001], b[1000001]; int f(int n) { int sum=0; while (n) { sum += n % 10; n = n / 10; } return sum; } int main() { int i, j, r, l, t; memset(a, 0, sizeof(a)); for (i = 2; i <=sqrt(1000000); i++) {
if (!a[i]) { for (j = i*i; j <=1000000; j += i) //少打了一個0,導致wrong了好幾發 a[j] = 1; } } a[1] = 1; b[0] = b[1] = 0; b[2] = 1; for (i = 3; i <= 1000001; i++) { if (a[i]==0 && a[f(i)]==0) //該數為素數且該數的各位數之和為素數 b[i] = b[i - 1] + 1; else b[i] = b[i - 1]; } scanf("%d", &t); int cur = 1; while (t--) { scanf("%d%d", &l, &r); printf("Case #%d: %d\n", cur++, b[r] - b[l - 1]); } return 0; }

2018-04-02

HDU4548 美素數【打表】【前綴和】