您的位置:首页 > 其它

PAT(乙)-1007. 素数对猜想 (20)

2016-12-07 13:24 363 查看

1007. 素数对猜想 (20)

让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。

输入格式:每个测试输入包含1个测试用例,给出正整数N。

输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。

输入样例:

20

输出样例:

4

分析:题目的意思可以理解为两部分,首先,找出N以内所有的素数,然后在这些素数里,要是相邻的两个素数之差为2,则可以看作是一个素数对,最后输出这个素数对的个数。

首先先判断一个素数,我们知道,只能被1和自己本身整除的数称为素数。(例如2,3,5,7等)。因此,先写出一个素数判断的条件

int temp = sqrt(num);
int i;
for(i = 2; i <= temp; i++)
{
if(num % i == 0)//如果这个数被整除了
return 0;//返回0,即非素数
}
return 1;//遍历完后仍不能被整除,返回1.即为素数。


然后分别将素数存入一个数组,每存入一个数后,立即进行判断其是否为素数对,即

if((a[num]-a[num-1])== 2)
cot++;


AC代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAXN 100000
int a[MAXN];
int isPrime(int num);//把素数判断写为一个函数
int main()
{
int num;
scanf("%d",&num);
memset(a,0,MAXN);//初始化存放素数的数组

int i,cnt1 = 2,cnt2 = 0;//cnt1为素数计数器,cnt2为素数对计数器
a[2] = 2;//2属于特殊素数,单独存放起来
//从3开始判断
for(i = 3; i <= num; i++){
if(isPrime(i)){
cnt1++;
a[cnt1] = i;
//判断素数对是否存在
if((a[cnt1]-a[cnt1-1])== 2){
cnt2++;
}
}
}
printf("%d",cnt2);//输出素数对的个数
return 0;
}

//判断是否为素数
int isPrime(int num){
int temp = sqrt(num);
int i;
for(i = 2; i <= temp; i++){
if(num % i == 0)
return 0;
}
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PAT-乙