1. 程式人生 > >PAT-乙-1007 1007 素數對猜想 (20 分)

PAT-乙-1007 1007 素數對猜想 (20 分)

在這裡插入圖片描述

程式碼

#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));

結果

在這裡插入圖片描述