HDU4548 美素數【打表】【前綴和】
阿新 • • 發佈:2018-04-03
cas 包括 各位數之和 tar rip desc tdi memory pro
問題是這樣的:一個十進制數,如果是素數,而且它的各位數字和也是素數,則稱之為“美素數”,如29,本身是素數,而且2+9 = 11也是素數,所以它是美素數。
給定一個區間,你能計算出這個區間內有多少個美素數嗎?
Input
第一行輸入一個正整數T,表示總共有T組數據(T <= 10000)。
接下來共T行,每行輸入兩個整數L,R(1<= L <= R <= 1000000),表示區間的左值和右值。
每組數據占一行,具體輸出格式參見樣例。
題目鏈接: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
問題是這樣的:一個十進制數,如果是素數,而且它的各位數字和也是素數,則稱之為“美素數”,如29,本身是素數,而且2+9 = 11也是素數,所以它是美素數。
給定一個區間,你能計算出這個區間內有多少個美素數嗎?
接下來共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 美素數【打表】【前綴和】