PAT-乙-1007 1007 素數對猜想 (20 分)
阿新 • • 發佈:2018-12-11
程式碼
#include <stdio.h> #include <string.h> #define MAX 100001 int isPrime[MAX]; int sum[MAX]; void selectPrime(){ for(int i=2; i<MAX; i++){ isPrime[i] = 1; } for(int i=2; i<MAX; i++){ if(isPrime[i]){ for(int j=i+i; j<MAX; j+=i){ isPrime[j] = 0; } } } } void count(){ memset(sum, 0, sizeof(sum)); for(int i=4; i<MAX; i++){ if(isPrime[i] && isPrime[i-2]){ sum[i] = sum[i-2] + 1; } else{ sum[i] = sum[i-1]; } } } int main(){ int num; scanf("%d", &num); selectPrime(); count(); printf("%d\n", sum[num]); return 0; }
註解
此題題意是找n以內的,差為2的素數,共有多少對。 因此關鍵問題是如何快速求素數。 採用篩法求素數的思想。即selectPrime()函式。先假設所有數都是素數。從2開始,2的倍數肯定都不是素數(一定有因子2)。同理,3的倍數也一定不是。一直找下去即可。 count()函式的作用是統計i和i-2都是素數,這樣的素數對的數目。
此題學到的內容: (1)篩法求素數。 (2)hash打表,一次性計算出題目資料範圍內的所有數,避免重複計算導致超時。 (3)memset函式賦初值0 #include <string.h> memset(sum, 0, sizeof(sum));