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-1] + 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));

结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhanggirlzhangboy/article/details/82792022
今日推荐